1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden * This file was generated automatically by gen-mterp.py for 'armv4t'.
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
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r6  rGLUE     MterpGlue 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
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rGLUE   r6
791da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rINST   r7
801da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rIBASE  r8
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* save/restore the PC and/or FP from the glue struct */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_PC_FROM_GLUE()     ldr     rPC, [rGLUE, #offGlue_pc]
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_PC_TO_GLUE()       str     rPC, [rGLUE, #offGlue_pc]
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_FP_FROM_GLUE()     ldr     rFP, [rGLUE, #offGlue_fp]
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_FP_TO_GLUE()       str     rFP, [rGLUE, #offGlue_fp]
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_PC_FP_FROM_GLUE()  ldmia   rGLUE, {rPC, rFP}
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_PC_FP_TO_GLUE()    stmia   rGLUE, {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
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be done *before* something calls dvmThrowException.
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 */
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #(_count*2)]!
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
1303a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * The operation performed here is similar to FETCH_ADVANCE_INST, except the
1313a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * src and dest registers are parameterized (not hard-wired to rPC and rINST).
1323a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden */
1333a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
1343a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden        ldrh    _dreg, [_sreg, #(_count*2)]!
1353a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden
1363a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/*
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 *
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We want to write "ldrh rINST, [rPC, _reg, lsl #2]!", 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 */
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #(_count*2)]
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#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 */
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#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/*
1703a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden * Put the prefetched instruction's opcode field into the specified register.
1713a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden */
1723a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
1733a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden
1743a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/*
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
179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the 32-bit value from a Dalvik register.
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GET_JIT_PROF_TABLE(_reg)    ldr     _reg,[rGLUE,#offGlue_pJitProfTable]
190d726991ba52466cde88e37aba4de2395b62477faBill Buzbee#define GET_JIT_THRESHOLD(_reg)     ldr     _reg,[rGLUE,#offGlue_jitThreshold]
191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert a virtual register index into an address.
195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden        add     _reg, rFP, _vreg, lsl #2
198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to expand the macros into assembler assignment statements.
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "../common/asm-constants.h"
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2057b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#if defined(WITH_JIT)
2067b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#include "../common/jit-config.h"
2077b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#endif
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/platform.S */
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  CPU-version-specific defines
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDR PC,xxx", which is not allowed pre-ARMv5.  Essentially a
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one-way branch.
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP.  Does not modify LR.
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDR_PC source
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, \source
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "MOV LR,PC / LDR PC,xxx", which is not allowed pre-ARMv5.
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Jump to subroutine.
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP and LR.
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDR_PC_LR source
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     lr, pc
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, \source
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDMFD SP!, {...regs...,PC}".
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP and LR.
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDMFD_PC regs
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {\regs,pc}
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/*
247c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Macro for data memory barrier; not meaningful pre-ARMv6K.
248c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */
2490890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden.macro  SMP_DMB
250c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.endm
251c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/entry.S */
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't have formal stack frames, so gdb scans upward in the code
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to find the start of the function (a label with the %function type),
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and then looks at the next few instructions to figure out what
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * got pushed onto the stack.  From this it figures out how to restore
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the registers, including PC, for the previous stack frame.  If gdb
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sees a non-function label, it stops scanning, so either we need to
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have nothing but assembler-local labels between the entry point and
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the break, or we need to fake it out.
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When this is defined, we add some stuff to make gdb less confused.
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ASSIST_DEBUGGER 1
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0  MterpGlue* glue
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This function returns a boolean "changeInterp" value.  The return comes
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * via a call to dvmMterpStdBail().
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY1 \
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .save {r4-r10,fp,lr}; \
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY2 \
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .pad    #4; \
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align 64
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* save stack pointer, add magic word for debuggerd */
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     sp, [r0, #offGlue_bailPtr]  @ save SP for eventual return
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up "named" registers, figure out entry point */
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rGLUE, r0                   @ set rGLUE
31551ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee    ldr     r1, [r0, #offGlue_entryPoint]   @ enum is 4 bytes in aapcs-EABI
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FP_FROM_GLUE()              @ load rPC and rFP from "glue"
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adr     rIBASE, dvmAsmInstructionStart  @ set rIBASE
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryInstr      @ usual case?
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .Lnot_instr                 @ no, handle it
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
321ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
322d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng.LentryInstr:
3237a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr     r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self
324ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Entry is always a possible trace start */
325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
326ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
3277a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov     r1, #0                      @ prepare the value for the new state
3287a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    str     r1, [r10, #offThread_inJitCodeCache] @ back to the interp land
3297a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp     r0,#0                       @ is profiling disabled?
3307a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#if !defined(WITH_SELF_VERIFICATION)
3317a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    bne     common_updateProfile        @ profiling is enabled
3327a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#else
3337a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr     r2, [r10, #offThread_shadowSpace]   @ to find out the jit exit state
3347a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    beq     1f                          @ profiling is disabled
3357a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
3367a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp     r3, #kSVSTraceSelect        @ hot trace following?
3377a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
3387a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    beq     common_selectTrace          @ go build the trace
3397a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
3407a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    beq     1f                          @ intrepret the next instruction
3417a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    b       common_updateProfile        @ collect profiles
3427a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#endif
3437a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng1:
344ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
345ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
346ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* start executing the instruction at rPC */
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
351ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr:
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryReturn     @ were we returning from a method?
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_returnFromMethod
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_return:
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryThrow      @ were we throwing an exception?
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
361ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
362ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.Lnot_throw:
363d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r10,[rGLUE, #offGlue_jitResumeNPC]
364d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r2,[rGLUE, #offGlue_jitResumeDPC]
365ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #kInterpEntryResume     @ resuming after Jit single-step?
366ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .Lbad_arg
367ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     rPC,r2
368d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bne     .LentryInstr                @ must have branched, don't resume
369d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#if defined(WITH_SELF_VERIFICATION)
370d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    @ glue->entryPoint will be set in dvmSelfVerificationSaveState
371d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b       jitSVShadowRunStart         @ re-enter the translation after the
372d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng                                        @ single-stepped instruction
373d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    @noreturn
374d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#endif
375ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, #kInterpEntryInstr
37651ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee    str     r1, [rGLUE, #offGlue_entryPoint]
377d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bx      r10                         @ re-enter the translation
378ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
379ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lbad_arg:
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strBadEntryPoint
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r1 holds value of entryPoint
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAbort
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pushed some registers on the stack in dvmMterpStdRun, then saved
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SP and LR.  Here we restore SP, restore the registers, and then restore
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LR to PC.
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0  MterpGlue* glue
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1  bool changeInterp
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     sp, [r0, #offGlue_bailPtr]      @ sp<- saved SP
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                          @ return the changeInterp value
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4                      @ un-align 64
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDMFD_PC "r4-r10,fp"                    @ restore 9 regs and return
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references.
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrBadEntryPoint:
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrBadEntryPoint
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionStart
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmInstructionStart, %function
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOP.S */
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_inst, %function
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_inst:
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE.S */
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide vA, vB */
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
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    .balign 64
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- BBBB
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
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    .balign 64
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_16.S */
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- BBBB
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- AAAA
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
528445194bc141dc67e2f678aa1bbd5e59ca66254e5Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT.S */
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_16.S */
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-result-wide vAA */
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_EXCEPTION.S */
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-exception vAA */
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offThread_exception]  @ r3<- dvmGetException bypass
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ r1<- 0
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ dvmClearException bypass
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_VOID.S */
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_WIDE.S */
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 64-bit value.  Copies the return value into the "glue"
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* return-wide vAA */
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ retval<- r0/r1
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_OBJECT.S */
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_4.S */
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/4 vA, #+B */
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r0)                    @ fp[A]<- r1
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_16.S */
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/16 vAA, #+BBBB */
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST.S */
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const vAA, #+BBBBbbbb */
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_HIGH16.S */
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsl #16             @ r0<- BBBB0000
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_16.S */
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_32.S */
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE.S */
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 4)                        @ r3<- HHHH (high)
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #0                      @ r0<- 00000000
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsl #16             @ r1<- BBBB0000
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING.S */
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBB */
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_resolve
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING_JUMBO.S */
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_JUMBO_resolve
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_CLASS.S */
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/class vAA, Class@BBBB */
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_CLASS_resolve
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_ENTER.S */
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Synchronize on an object.
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-enter vAA */
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
8763a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    EXPORT_PC()                         @ need for precise GC, MONITOR_TRACKING
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null object, throw an exception
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLockObject               @ call(self, obj)
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION /* implies WITH_MONITOR_TRACKING */
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offThread_exception] @ check for exception
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ exception raised, bail out
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_EXIT.S */
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlock an object.
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction spec.
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-exit vAA */
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ before fetch: export the PC
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
9056bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     1f                          @ yes
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
9106bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     common_exceptionThrown      @ yes, exception is pending
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9136bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee1:
9146bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    FETCH_ADVANCE_INST(1)               @ advance before throw
9156bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    b      common_errNullObject
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CHECK_CAST.S */
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* check-cast vAA, class@BBBB */
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- BBBB
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r3)                    @ r9<- object
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_methodClassDex]    @ r0<- pDvmDex
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ is object null?
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved:
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay:
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INSTANCE_OF.S */
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if an object reference is an instance of a class.
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Most common situation is a non-null object, being compared against
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an already-resolved class.
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15                 @ r9<- A
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- pDvmDex
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- CCCC
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ARRAY_LENGTH.S */
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the length of an array.
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yup, fail
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ vB<- length
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_INSTANCE.S */
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new instance of a class.
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-instance vAA, class@BBBB */
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for init, resolve, alloc
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved:   @ r0=class
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized: @ r0=class
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
1013b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    bl      dvmAllocObject              @ r0<- new object
1014b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    b       .LOP_NEW_INSTANCE_finish          @ continue
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_ARRAY.S */
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- CCCC
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r0)                    @ r1<- vB (array length)
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ check length
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_errNegativeArraySize @ negative length, bail
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for resolve, alloc
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_continue
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC();
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ 0 means an exception is thrown
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ has exception
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_THROW.S */
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception object in the current thread.
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* throw vAA */
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
11278ba2708ea118381f2df5ca55b9bad2ae4c050504Andy McFadden    EXPORT_PC()                         @ exception handler can throw
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, throw an NPE instead
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ bypass dvmSetException, just store it
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ thread->exception<- obj
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO.S */
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 8-bit offset.
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto +AA */
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asr #24             @ r9<- ssssssAA (sign-extended)
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r9, lsl #1              @ r9<- byte offset
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_16.S */
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 16-bit offset.
1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/16 +AAAA */
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- byte offset, check sign
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_32.S */
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 32-bit offset.
1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * our "backward branch" test must be "<=0" instead of "<0".  The ORRS
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction doesn't affect the V flag, so we need to clear it
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * explicitly.
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/32 +AAAAAAAA */
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, ip                      @ (clear V flag during stall)
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    r0, r0, r1, lsl #16         @ r0<- AAAAaaaa, check sign
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0, asl #1              @ r9<- byte offset
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble     common_backwardBranch       @ backward branch, do periodic checks
1211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1212ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1254ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPARSE_SWITCH.S */
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1286ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1287ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1290ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1295ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1297ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish:
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_FLOAT.S */
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish:
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_DOUBLE.S */
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMP_LONG.S */
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register based on the results of the comparison.
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We load the full values with LDM, but in practice many values could
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be resolved by only looking at the high word.  This could be made
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * faster or slower by splitting the LDM into a pair of LDRs.
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If we just wanted to set condition flags, we could do this:
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subs    ip, r0, r2
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  sbcs    ip, r1, r3
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subeqs  ip, r0, r2
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * integer value, which we can do with 2 conditional mov/mvn instructions
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * us a constant 5-cycle path plus a branch at the end to the
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction epilogue code.  The multi-compare approach below needs
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the worst case (the 64-bit values are equal).
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt     .LOP_CMP_LONG_greater
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r1, r0, r2                  @ r1<- r0 - r2
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CMP_LONG_less
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQ.S */
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1543ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1544ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1545ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1546ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1547ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1548ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1549ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1552ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NE.S */
1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1579ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1580ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1581ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1582ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1583ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1584ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1585ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1588ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LT.S */
1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1616ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1617ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1618ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1619ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1621ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1624ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GE.S */
1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1651ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1652ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1653ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1654ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1655ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1656ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1657ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1660ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GT.S */
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1687ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1688ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1689ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1690ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1691ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1692ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1693ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1696ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LE.S */
1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1725ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1727ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1728ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1729ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1732ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQZ.S */
1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1756ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1757ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1758ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1759ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1760ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1761ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1768ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NEZ.S */
1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1792ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1793ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1794ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1795ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1797ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1800ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1801ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1802ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1803ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1804ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */
1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LTZ.S */
1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1828ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1829ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1830ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1831ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1832ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1833ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1836ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1837ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1838ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1839ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1840ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
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_IF_GEZ: /* 0x3b */
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GEZ.S */
1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1864ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1865ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1866ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1867ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1868ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1869ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1870ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1871ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1872ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1873ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1876ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GTZ.S */
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1900ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1901ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1902ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1903ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1904ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1905ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1906ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1907ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1908ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1909ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1912ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LEZ.S */
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1936ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1937ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1938ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1939ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1940ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1941ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1944ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1945ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1946ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1947ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1948ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3E.S */
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3F.S */
1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_40.S */
1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_41.S */
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_42.S */
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_43.S */
1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */
2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
2032d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_AGET_WIDE.S */
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aget-wide vAA, vBB, vCC */
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_OBJECT.S */
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BOOLEAN.S */
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BYTE.S */
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_CHAR.S */
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_SHORT.S */
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
2249d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_APUT_WIDE.S */
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 64 bits.  vBB[vCC] <- vAA.
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aput-wide vAA, vBB, vCC */
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_OBJECT.S */
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Store an object into an array.  vBB[vCC] <- vAA.
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2287d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
2289d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    cmp     rINST, #0                   @ null array object?
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r9)                    @ r9<- vAA
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2292d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2293d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    add     r10, rINST, r0, lsl #2      @ r10<- arrayObj + index*width
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r3                      @ compare unsigned index, length
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BOOLEAN.S */
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BYTE.S */
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_CHAR.S */
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_SHORT.S */
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */
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
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_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_finish          @ no, already resolved
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_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_finish
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
2456d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_IGET_WIDE.S */
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Wide 32-bit instance field get.
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide vA, vB, field@CCCC */
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT.S */
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BOOLEAN.S */
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BYTE.S */
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_CHAR.S */
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_SHORT.S */
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2628919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ no, already resolved
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ yes, finish up
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
2650d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_IPUT_WIDE.S */
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide vA, vB, field@CCCC */
2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT.S */
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2673919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit instance field put.
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2675919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput-object, iput-object-volatile
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BOOLEAN.S */
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2703919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BYTE.S */
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2732919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_CHAR.S */
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2761919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
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_IPUT_SHORT: /* 0x5f */
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_SHORT.S */
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2790919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_resolve         @ yes, do resolve
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish: @ field ptr in r0
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
28280890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
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_WIDE: /* 0x61 */
2838d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_SGET_WIDE.S */
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:
2850861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2851861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2852861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
28536e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2854861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
2855861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r0, {r0-r1}                 @ r0/r1<- field value (aligned)
2856861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
2857861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2859861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_OBJECT.S */
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish: @ field ptr in r0
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
28820890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BOOLEAN.S */
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
29090890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BYTE.S */
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish: @ field ptr in r0
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
29360890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_CHAR.S */
2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish: @ field ptr in r0
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
29630890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_SHORT.S */
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish: @ field ptr in r0
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
29900890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
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 */
3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, 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_resolve         @ yes, do resolve
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_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
30190890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
3026d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_SPUT_WIDE.S */
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SPUT handler.
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sput-wide vAA, field@BBBB */
3031861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]    @ r0<- DvmDex
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3033861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
3035861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
3037861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
3039861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3041861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
3042861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
3043861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
3044861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
30456e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
3046861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
3047861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r2, {r0-r1}                 @ field<- vAA/vAA+1
3048861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
3049861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_OBJECT.S */
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3056919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit SPUT handler for objects
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3058919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput-object, sput-object-volatile
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3066919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    bne     .LOP_SPUT_OBJECT_finish          @ no, continue
3067b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    ldr     r9, [rGLUE, #offGlue_method]    @ r9<- current method
3068919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    EXPORT_PC()                         @ resolve() could throw, so export now
3069d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    ldr     r0, [r9, #offMethod_clazz]  @ r0<- method->clazz
3070919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
3071919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r0, #0                      @ success?
3072919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    bne     .LOP_SPUT_OBJECT_finish          @ yes, finish
3073919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    b       common_exceptionThrown      @ no, handle exception
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BOOLEAN.S */
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3084919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
30980890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BYTE.S */
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3111919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
31250890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_CHAR.S */
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3138919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
31520890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_SHORT.S */
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3165919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
31790890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange   @ no, continue on
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ yes, continue on
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ no, continue
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/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 */
3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3328de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    b       common_invokeMethodNoRange @ jump to common handler
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_73.S */
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange   @ no, continue on
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ yes, continue on
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ no, continue
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3491de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    b       common_invokeMethodRange @ jump to common handler
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_79.S */
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_7A.S */
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_INT.S */
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_INT.S */
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_LONG.S */
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_LONG.S */
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                           @ optional op; may set condition codes
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_FLOAT.S */
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_DOUBLE.S */
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_LONG.S */
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_FLOAT.S */
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2f                              @ r0<- op, r0-r3 changed
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_DOUBLE.S */
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2d                              @ r0<- op, r0-r3 changed
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_INT.S */
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_FLOAT.S */
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_INT.S */
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                              @ r0<- op, r0-r3 changed
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unop.S" {"instr":"bl      f2i_doconv"}
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to an int in r0.
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2i_doconv:
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x4f000000             @ (float)maxint
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxint?
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xcf000000             @ (float)minint
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minint?
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                @ convert float to int
3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_LONG.S */
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2d                              @ r0<- op, r0-r3 changed
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_INT.S */
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                              @ r0<- op, r0-r3 changed
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl      d2i_doconv"}
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0.
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv:
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
39965162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0x80000000             @ maxint, as a double (low word)
39975162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, r2, asr #9              @  0xffc00000
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
39995162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvn     r3, #0xbe000000             @ maxint, as a double (high word)
40005162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    sub     r3, r3, #0x00200000         @  0x41dfffff
40015162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxint?
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
40055162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvnne   r0, #0x80000000             @ return maxint (0x7fffffff)
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
40105162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc1000000             @ minint, as a double (high word)
40115162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, r3, #0x00e00000         @  0xc1e00000
40125162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minint, as a double (low word)
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minint?
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ return zero for NaN
4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                @ convert double to int
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_LONG.S */
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2f                              @ r0<- op, r0-r3 changed
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_BYTE.S */
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #24                           @ optional op; may set condition codes
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_CHAR.S */
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_SHORT.S */
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT.S */
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT.S */
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT.S */
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT.S */
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT.S */
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT.S */
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT.S */
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT.S */
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT.S */
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT.S */
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT.S */
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG.S */
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG.S */
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG.S */
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        WX
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      x YZ
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  --------
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     ZW ZX
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  YW YX
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The low word of the result holds ZX, the high word holds
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * it doesn't fit in the low 64 bits.
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most ARM math operations, multiply instructions have
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * restrictions on using the same register more than once (Rd and Rm
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cannot be the same).
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_MUL_LONG_finish
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG.S */
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG.S */
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG.S */
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG.S */
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop 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     r2, r0, #255                @ r2<- BB
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG.S */
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG.S */
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_finish
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG.S */
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_finish
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG.S */
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long vAA, vBB, vCC */
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_finish
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT.S */
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT.S */
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT.S */
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT.S */
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT.S */
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE.S */
5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE.S */
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE.S */
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE.S */
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE.S */
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_2ADDR.S */
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5515a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT_2ADDR.S */
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5554a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_2ADDR.S */
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5594a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_2ADDR.S */
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5633a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_2ADDR.S */
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5673a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_2ADDR.S */
5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5712a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_2ADDR.S */
5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5751a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_2ADDR.S */
5770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5790a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_2ADDR.S */
5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5829a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_2ADDR.S */
5848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5868a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_2ADDR.S */
5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5907a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG_2ADDR.S */
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, "/2addr" version.
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_MUL_LONG for an explanation.
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We get a little tight on registers, so to avoid looking up &fp[A]
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again we stuff it into rINST.
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG_2ADDR.S */
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG_2ADDR.S */
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG_2ADDR.S */
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG_2ADDR.S */
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_2ADDR_finish
6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long/2addr vA, vB */
6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_2ADDR_finish
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long/2addr vA, vB */
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_2ADDR_finish
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6342a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6381a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */
6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6420a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6459a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6499a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */
6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT16.S */
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT.S */
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT16.S */
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT16.S */
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT16.S */
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT16.S */
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT16.S */
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT16.S */
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT8.S */
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT_LIT8.S */
7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT8.S */
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT8.S */
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT8.S */
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT8.S */
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT8.S */
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT8.S */
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_LIT8.S */
7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_LIT8.S */
7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_LIT8.S */
7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7433c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_VOLATILE: /* 0xe3 */
7434c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_VOLATILE.S */
7435c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */
7436c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7437c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit instance field get.
7438c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7439c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7440c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7441c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
7442c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
7443c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
7444c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
7445c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7446c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7447c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7448c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7449c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
7450c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7451c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
7452c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7453c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7454c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0
7455c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_VOLATILE_finish
7456c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
7457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7461c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_VOLATILE: /* 0xe4 */
7462c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_VOLATILE.S */
7463c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT.S */
7464c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7465c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit instance field put.
7466c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7467919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
7468c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7469c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
7470c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
7471c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
7472c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
7473c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7474c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7475c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7476c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7477c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
7478c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7479c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
7480c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7481c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7482c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ success?
7483c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7484c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
7485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7489c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_VOLATILE: /* 0xe5 */
7490c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_VOLATILE.S */
7491c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */
7492c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7493c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit SGET handler.
7494c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7495c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7496c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7497c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
7498c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
7499c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
7500c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
7501c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
7502c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7503c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7504c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7505c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
75060890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ acquiring load
7507c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
7508c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7509c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7510c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7511c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7516c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_VOLATILE: /* 0xe6 */
7517c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_VOLATILE.S */
7518c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT.S */
7519c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7520c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit SPUT handler.
7521c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7522919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7523c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7524c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
7525c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
7526c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
7527c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
7528c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
7529c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7530c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7531c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7532c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
7533c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7534c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7535c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
75360890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ releasing store
7537c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
7538c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7543c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7544c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7545c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */
7546c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7547c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit instance field get.
7548c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7549c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7550c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7551c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
7552c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
7553c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
7554c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
7555c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7556c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7557c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7558c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7559c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
7560c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7561c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
7562c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7563c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7564c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0
7565c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7566c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
7567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
75715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7572861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_IGET_WIDE_VOLATILE.S */
7573861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_IGET_WIDE.S */
75745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
75755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Wide 32-bit instance field get.
75765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
75775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iget-wide vA, vB, field@CCCC */
75785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
75795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
75805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
75815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
75825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
75835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
75845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
75855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
75865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
75875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
75885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
75895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
75905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0
75915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish
75925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
75975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7598861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_IPUT_WIDE_VOLATILE.S */
7599861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_IPUT_WIDE.S */
76005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iput-wide vA, vB, field@CCCC */
76015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
76025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
76035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
76045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
76055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
76065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
76075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
76095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
76105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
76115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
76125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
76135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
76145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
76155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7621861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_SGET_WIDE_VOLATILE.S */
7622861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_SGET_WIDE.S */
76235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SGET handler.
76255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sget-wide vAA, field@BBBB */
76275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
76285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
76295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
76305387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
76315387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
76335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_finish:
7634861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7635861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7636861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
76376e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7638861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7639861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r0, {r0-r1}                 @ r0/r1<- field value (aligned)
7640861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7641861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
76425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7643861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
76445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
76455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76505387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7651861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_SPUT_WIDE_VOLATILE.S */
7652861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden/* File: armv4t/OP_SPUT_WIDE.S */
76535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SPUT handler.
76555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sput-wide vAA, field@BBBB */
7657861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]    @ r0<- DvmDex
76585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
7659861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
76605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7661861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
76625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7663861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
76645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7665861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
76665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7667861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7668861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7669861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7670861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
76716e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
7672861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7673861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r2, {r0-r1}                 @ field<- vAA/vAA+1
7674861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7675861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
7676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
768096516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
768196516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: armv5te/OP_BREAKPOINT.S */
7682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76883a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
76893a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
76903a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /*
76913a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * Handle a throw-verification-error instruction.  This throws an
76923a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception for an error discovered during verification.  The
76933a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception is indicated by AA, with some detail provided by BBBB.
76943a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     */
76953a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /* op AA, ref@BBBB */
7696b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
76973a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    FETCH(r2, 1)                        @ r2<- BBBB
7698b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    EXPORT_PC()                         @ export the PC
76993a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     r1, rINST, lsr #8           @ r1<- AA
77003a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    bl      dvmThrowVerificationError   @ always throws
77013a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    b       common_exceptionThrown      @ handle exception
7702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
7706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_EXECUTE_INLINE.S */
7707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7710b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7711b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7713b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7714b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7715b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 1)                       @ r10<- BBBB
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ can throw
7721b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [sp]                    @ push &glue->retval
7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ pop stack
7726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ test boolean result of inline
7727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ returned false, handle exception
7728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7734b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7735b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7736b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
7737b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Execute a "native inline" instruction, using "/range" semantics.
7738b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Same idea as execute-inline, but we get the args differently.
7739b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7740b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7741b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7742b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7743b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7744b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7745b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7746b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
7747b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7748b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r10, 1)                       @ r10<- BBBB
7749b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7750b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    EXPORT_PC()                         @ can throw
7751b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7752b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
7753b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    str     r1, [sp]                    @ push &glue->retval
7754b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7755b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     sp, sp, #8                  @ pop stack
7756b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    cmp     r0, #0                      @ test boolean result of inline
7757b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    beq     common_exceptionThrown      @ returned false, handle exception
7758b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7759b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7760b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_EMPTY.S */
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_F1.S */
7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7803d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_IGET_WIDE_QUICK.S */
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide-quick vA, vB, offset@CCCC */
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, r3, r1                  @ r9<- object + offset
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- obj.field (64 bits, aligned)
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7845919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    /* For: iput-quick */
7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7863d7bf3656e8c57e630aec26aa29eeea3eb4ca99abAndy McFadden/* File: armv4t/OP_IPUT_WIDE_QUICK.S */
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide-quick vA, vB, offset@CCCC */
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A(+)
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ check object for null
7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- field byte offset
7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, r2, r3                  @ r2<- object + byte offset
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ obj.field (64 bits, aligned)<- r0/r1
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7884919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    /* For: iput-object-quick */
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7894919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]  @ r2<- card table base
7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7897919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r0, #0
7898d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8012c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
8013c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
8014919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee/* File: armv5te/OP_IPUT_OBJECT.S */
8015c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
8016919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit instance field put.
8017c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
8018919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput-object, iput-object-volatile
8019c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
8020c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
8021c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
8022c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
8023c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
8024c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8025c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
8026c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8027c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
8028c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
8029c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8030c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
8031c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8032c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8033c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ success?
8034c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
8035c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8040c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
8041c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
8042c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */
8043c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
8044c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit SGET handler.
8045c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
8046c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
8047c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
8048c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
8049c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
8050c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
8051c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8052c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8053c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
8054c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
8055c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
8056c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
80570890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ acquiring load
8058c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
8059c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8060c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
8061c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8062c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8067c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
8068c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
8069919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee/* File: armv5te/OP_SPUT_OBJECT.S */
8070c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
8071919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit SPUT handler for objects
8072c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
8073919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput-object, sput-object-volatile
8074c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
8075c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
8076c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
8077c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
8078c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8079c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8080c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
8081919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    bne     .LOP_SPUT_OBJECT_VOLATILE_finish          @ no, continue
8082b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    ldr     r9, [rGLUE, #offGlue_method]    @ r9<- current method
8083919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    EXPORT_PC()                         @ resolve() could throw, so export now
8084d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    ldr     r0, [r9, #offMethod_clazz]  @ r0<- method->clazz
8085919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8086919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r0, #0                      @ success?
8087919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    bne     .LOP_SPUT_OBJECT_VOLATILE_finish          @ yes, finish
8088919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    b       common_exceptionThrown      @ no, handle exception
8089919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee
8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FF.S */
8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionEnd
8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd:
8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Sister implementations
8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterStart
8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmSisterStart, %function
8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 4
8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart:
8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */
8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (String ref)
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve:
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBBBBBB (String ref)
8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */
8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the Class has not yet been resolved.
8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (Class ref)
8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve:
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- Class reference
8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_okay            @ no, success
8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ A cast has failed.  We need to throw a ClassCastException with the
8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ class of the object that failed to be cast.
8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ about to throw
8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]  @ r3<- obj->clazz
8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .LstrClassCastExceptionPtr
8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r3, #offClassObject_descriptor] @ r1<- obj->clazz->descriptor
8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowExceptionWithClassMessage
8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds BBBB
8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve:
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- BBBB
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastExceptionPtr:
8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrClassCastException
8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_INSTANCE_OF_store
8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r0 holds boolean result
8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r9 holds A
8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store:
8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test succeeded, save and bail.
8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial:
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #1                      @ indicate success
8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r3 holds BBBB
8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve:
8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r3                      @ r1<- BBBB
8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 32                          @ minimize cache lines
8277b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden.LOP_NEW_INSTANCE_finish: @ r0=new object
8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class initialization required.
8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class object
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0                      @ save r0
8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInitClass                @ initialize class
8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ check boolean result
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ restore r0
8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ failed, deal with init exception
8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds BBBB
8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationErrorPtr:
8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInstantiationError
8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */
8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds class ref CCCC
8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve:
8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ r9<- length (save)
8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- CCCC
8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ r1<- length (restore)
8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_NEW_ARRAY_finish
8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation.
8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class
8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish:
8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ vA<- r0
8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8365919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8371919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     rINST, #'I'                 @ array of ints?
8372919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmpne   rINST, #'L'                 @ array of objects?
8373919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmpne   rINST, #'['                 @ array of arrays?
8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8381919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    str     r0, [rGLUE, #offGlue_retval]      @ retval.l <- new array
8382919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    str     rINST, [rGLUE, #offGlue_retval+4] @ retval.h <- type
8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8414919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r0, [rGLUE, #offGlue_retval]     @ r0<- object
8415919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r1, [rGLUE, #offGlue_retval+4]   @ r1<- type
8416919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]  @ r2<- card table base
8417919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
8418919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r1, #'I'                         @ Is int array?
8419d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
8420919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GOTO_OPCODE(ip)                          @ execute it
8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)                 @ define in one or the other, not both
8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8449919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8455919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     rINST, #'I'                 @ array of ints?
8456919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmpne   rINST, #'L'                 @ array of objects?
8457919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmpne   rINST, #'['                 @ array of arrays?
8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8465919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    str     r0, [rGLUE, #offGlue_retval]      @ retval.l <- new array
8466919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    str     rINST, [rGLUE, #offGlue_retval+4] @ retval.h <- type
8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8498919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r0, [rGLUE, #offGlue_retval]     @ r0<- object
8499919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r1, [rGLUE, #offGlue_retval+4]   @ r1<- type
8500919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]  @ r2<- card table base
8501919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
8502919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r1, #'I'                         @ Is int array?
8503d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
8504919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GOTO_OPCODE(ip)                          @ execute it
8505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
8511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)                 @ define in one or the other, not both
8517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
8524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_gt_or_nan:
8529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_FLOAT_finish
8535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_FLOAT_finish
8537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_continue
8556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_continue:
8559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPL_FLOAT_nan               @ no, must be NaN
8566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_finish:
8570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_nan:
8581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_finish
8583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
8587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_gt_or_nan:
8592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_FLOAT_finish
8598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_FLOAT_finish
8600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_continue
8619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_continue:
8622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPG_FLOAT_nan               @ no, must be NaN
8629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_finish:
8633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_nan:
8644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_finish
8646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
8650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_gt_or_nan:
8655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_DOUBLE_finish
8661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_DOUBLE_finish
8663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
8665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_gt_or_nan:
8670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_DOUBLE_finish
8676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_DOUBLE_finish
8678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */
8680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_less:
8682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                      @ r1<- -1
8683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Want to cond code the next mov so we can avoid branch, but don't see it;
8684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ instead, we just replicate the tail end.
8685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)                    @ vAA<- r1
8687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_greater:
8691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ r1<- 1
8692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish:
8695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)                    @ vAA<- r1
8697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */
8701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish:
8703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents
8705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r0, {r2-r3}                 @ r2/r3 <- vBB[vCC]
8706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
8707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
8709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */
8712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish:
8714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
8716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, #offArrayObject_contents
8718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r2-r3}                 @ vBB[vCC] <- r2/r3
8719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */
8722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8724d82097f6b409c5cd48568e54eb701604c3cceb18buzbee     *  rINST = vBB (arrayObj)
8725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = vAA (obj)
8726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = offset into array (vBB + vCC * width)
8727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_finish:
8729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ storing null reference?
8730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
8731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8732d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
8733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCanPutArrayElement       @ test object type vs. array type
8734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ okay?
8735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errArrayStore        @ no
8736d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    mov     r1, rINST                   @ r1<- arrayObj
8737919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8738919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]     @ get biased CT base
8739919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
8740919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8741919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    str     r9, [r10]                   @ vBB[vCC]<- vAA
8742d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
8743919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GOTO_OPCODE(ip)                     @ jump to next instruction
8744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
8745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
8748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */
8751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish:
8758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
87630890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
8764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */
8772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish:
8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8782861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
8783861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
87846e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8785861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, r9, r3                  @ r9<- obj + field offset
8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- obj.field (64-bit align ok)
8788861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8789861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8791861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */
8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish:
8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
88100890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
88310890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */
8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish:
8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
88520890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */
8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish:
8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
88730890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */
8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish:
8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
88940890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */
8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish:
8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
89190890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
8920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */
8924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish:
8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
8936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
8939861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8940861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- object + byte offset
8941861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
89426e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
8943861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8944861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r2, {r0-r1}                 @ obj.field (64 bits, aligned)<- r0/r1
8945861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8946861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */
8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish:
8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8962919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]  @ r2<- card table base
8963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
89660890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
8967d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
8968919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r0, #0                      @ stored a null reference?
8969919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
8980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
89890890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
8990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */
8994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish:
9001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
9002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
9003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
9005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
9006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
9007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
9008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
90100890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
9011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */
9015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
9018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
9019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
9020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish:
9022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
9023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
9024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
9026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
9027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
9028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
9029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
90310890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
9032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */
9036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
9039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
9040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
9041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish:
9043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
9044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
9045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
9047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
9048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
9049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
9050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
90520890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ releasing store
9053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */
9057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve:
9063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_finish          @ yes, finish
9069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */
9072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9076861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9077861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
9078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve:
9080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_WIDE_finish          @ yes, finish
9086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */
9089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve:
9095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_OBJECT_finish          @ yes, finish
9101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
9104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve:
9110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_BOOLEAN_finish          @ yes, finish
9116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */
9119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve:
9125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_BYTE_finish          @ yes, finish
9131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */
9134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve:
9140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_CHAR_finish          @ yes, finish
9146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */
9149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve:
9155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_SHORT_finish          @ yes, finish
9161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */
9164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve:
9170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_finish          @ yes, finish
9176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */
9179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: &fp[AA]
9184861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9185861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
9186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve:
9188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9193861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
9194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_WIDE_finish          @ yes, finish
9195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
9198b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
9199919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    mov     r2, rINST, lsr #8           @ r2<- AA
9200919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9201919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_VREG(r1, r2)                    @ r1<- fp[AA]
9202919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]  @ r2<- card table base
9203b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
9204919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9205919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    @ no-op                             @ releasing store
9206b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    str     r1, [r0, #offStaticField_value]  @ field<- vAA
9207919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r1, #0                      @ stored a null object?
9208d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
9209919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GOTO_OPCODE(ip)                     @ jump to next instruction
9210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
9212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
9218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BOOLEAN_finish          @ yes, finish
9224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */
9227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve:
9233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BYTE_finish          @ yes, finish
9239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */
9242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve:
9248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_CHAR_finish          @ yes, finish
9254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */
9257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve:
9263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_SHORT_finish          @ yes, finish
9269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
9272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
9279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r10)                   @ r1<- "this" ptr
9280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is "this" null?
9282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
9283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
9284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
9287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
9289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
9294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue:
9296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
9297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
9300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
9302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
9305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
9307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
9308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
9312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
9319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
9323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
9330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
9337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */
9340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue:
9347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r10)                   @ r1<- "this" ptr
9348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is "this" null?
9350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
9351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
9352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
9355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
9357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
9362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
9364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
9365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
9368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
9370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
9373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
9375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
9376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
9380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
9387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
9391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
9398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
9405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
9408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to a long in r0/r1.
9410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2l_doconv:
9416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
9417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x5f000000             @ (float)maxlong
9418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
9419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxlong?
9420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffff)
9422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xdf000000             @ (float)minlong
9427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minlong?
9428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (80000000)
9430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
9435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
9436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}
9439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2lz                @ convert float to long
9442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
9443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
9445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to a long in r0/r1.
9447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2l_doconv:
9453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
94545162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0x43000000             @ maxlong, as a double (high word)
94555162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0x43e00000
94565162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ maxlong, as a double (low word)
9457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
94585162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
9459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
9460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxlong?
9461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
9463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
94685162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc3000000             @ minlong, as a double (high word)
94695162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0xc3e00000
94705162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minlong, as a double (low word)
9471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minlong?
9472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (8000000000000000)
9474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
9480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
9481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
9482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f
9485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2lz                @ convert double to long
9489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
9491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
9492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
9493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */
9495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_finish:
9497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
9499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */
9502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish:
9504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
9505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */
9510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish:
9512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
9513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */
9518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish:
9520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
9521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
9526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
9528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
9533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
9535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
9540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
9542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9546c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IGET_VOLATILE */
9547c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9548c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
9549c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * Currently:
9550c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r0 holds resolved field
9551c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r9 holds object
9552c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
9553c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IGET_VOLATILE_finish:
9554c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    @bl      common_squeak0
9555c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r9, #0                      @ check object for null
9556c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9557c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     common_errNullObject        @ object was null
9558c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
95590890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ acquiring load
9560c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
9561c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9562c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    and     r2, r2, #15                 @ r2<- A
9563c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9564c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
9565c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9566c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9567c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IPUT_VOLATILE */
9568c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9569c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
9570c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * Currently:
9571c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r0 holds resolved field
9572c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r9 holds object
9573c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
9574c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IPUT_VOLATILE_finish:
9575c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    @bl      common_squeak0
9576c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
9577c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9578c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    and     r1, r1, #15                 @ r1<- A
9579c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r9, #0                      @ check object for null
9580c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
9581c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     common_errNullObject        @ object was null
9582c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9583c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
95840890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ releasing store
9585c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9586c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9587c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9588c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SGET_VOLATILE */
9589c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9590c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
9591c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * Continuation if the field has not yet been resolved.
9592c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r1: BBBB field ref
9593c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
9594c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_VOLATILE_resolve:
9595c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9596c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
9597c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9598c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9599c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ success?
9600c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_SGET_VOLATILE_finish          @ yes, finish
9601c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown      @ no, handle exception
9602c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9603c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SPUT_VOLATILE */
9604c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9605c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
9606c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * Continuation if the field has not yet been resolved.
9607c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r1: BBBB field ref
9608c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
9609c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_VOLATILE_resolve:
9610c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9611c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
9612c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9613c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9614c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ success?
9615c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_SPUT_VOLATILE_finish          @ yes, finish
9616c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown      @ no, handle exception
9617c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9618c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IGET_OBJECT_VOLATILE */
9619c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9620c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
9621c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * Currently:
9622c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r0 holds resolved field
9623c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r9 holds object
9624c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
9625c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IGET_OBJECT_VOLATILE_finish:
9626c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    @bl      common_squeak0
9627c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r9, #0                      @ check object for null
9628c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9629c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     common_errNullObject        @ object was null
9630c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
96310890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ acquiring load
9632c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
9633c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9634c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    and     r2, r2, #15                 @ r2<- A
9635c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9636c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
9637c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9638c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
96395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IGET_WIDE_VOLATILE */
96405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
96425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
96435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
96445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
96455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
96465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IGET_WIDE_VOLATILE_finish:
96475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
96485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
96495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
9650861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
9651861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
96526e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
9653861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
9654861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, r9, r3                  @ r9<- obj + field offset
9655861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- obj.field (64-bit align ok)
9656861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
96575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
96585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9659861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
96605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
96615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
96625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
96635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
96645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IPUT_WIDE_VOLATILE */
96665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
96685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
96695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
96705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
96715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
96725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IPUT_WIDE_VOLATILE_finish:
96735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
96745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
96755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    and     r2, r2, #15                 @ r2<- A
96765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
96775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
96785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
96795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
96805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
9681861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
9682861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- object + byte offset
9683861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
96846e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
9685861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
9686861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r2, {r0-r1}                 @ obj.field (64 bits, aligned)<- r0/r1
9687861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
9688861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
96895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SGET_WIDE_VOLATILE */
96915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
96935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
96945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
9695861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9696861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
96975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
96985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_resolve:
96995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
97005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
97015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
97025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
97035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
97045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SGET_WIDE_VOLATILE_finish          @ yes, finish
97055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
97065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
97075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SPUT_WIDE_VOLATILE */
97085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
97095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
97105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
97115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
97125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9: &fp[AA]
9713861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9714861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
97155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
97165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SPUT_WIDE_VOLATILE_resolve:
97175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
97185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
97195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
97205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
97215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
9722861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
97235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SPUT_WIDE_VOLATILE_finish          @ yes, finish
97245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
97255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
9726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
9727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Extract args, call function.
9730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = #of args (0-4)
9731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = call index
9732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
9734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Other ideas:
9735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Use a jump table from the main piece to jump directly into the
9736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   AND/LDR pairs.  Costs a data load, saves a branch.
9737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Have five separate pieces that do the loading, so we can work the
9738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   interleave a little better.  Increases code size.
9739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
9741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #4                  @ r0<- 4-r0
9742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r9, 2)                        @ r9<- FEDC
9743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
9745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r9, #0xf000             @ isolate F
9746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
9747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r9, #0x0f00             @ isolate E
9748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
9749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r9, #0x00f0             @ isolate D
9750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
9751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r9, #0x000f             @ isolate C
9752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
9753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:
9754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, .LOP_EXECUTE_INLINE_table       @ table of InlineOperation
9755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (not reached)
9757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_table:
9759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   gDvmInlineOpsTable
9760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9761b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* continuation for OP_EXECUTE_INLINE_RANGE */
9762b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9763b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
9764b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Extract args, call function.
9765b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r0 = #of args (0-4)
9766b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r10 = call index
9767b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9768b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
9769b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_continue:
9770b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    rsb     r0, r0, #4                  @ r0<- 4-r0
9771b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r9, 2)                        @ r9<- CCCC
9772b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9773b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      common_abort                @ (skipped due to ARM prefetch)
9774b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden4:  add     ip, r9, #3                  @ base+3
9775b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r3, ip)                    @ r3<- vBase[3]
9776b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden3:  add     ip, r9, #2                  @ base+2
9777b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r2, ip)                    @ r2<- vBase[2]
9778b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden2:  add     ip, r9, #1                  @ base+1
9779b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r1, ip)                    @ r1<- vBase[1]
9780b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden1:  add     ip, r9, #0                  @ (nop)
9781b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r0, ip)                    @ r0<- vBase[0]
9782b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden0:
9783b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
9784b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9785b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    @ (not reached)
9786b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9787b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_table:
9788b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    .word   gDvmInlineOpsTable
9789b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9790c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_IPUT_OBJECT_VOLATILE */
9791c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9792c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
9793c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * Currently:
9794c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r0 holds resolved field
9795c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r9 holds object
9796c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
9797c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_IPUT_OBJECT_VOLATILE_finish:
9798c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    @bl      common_squeak0
9799c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
9800c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9801c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    and     r1, r1, #15                 @ r1<- A
9802c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r9, #0                      @ check object for null
9803c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
9804919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]  @ r2<- card table base
9805c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     common_errNullObject        @ object was null
9806c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9807c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
98080890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ releasing store
9809d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
9810919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r0, #0                      @ stored a null reference?
9811919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
9812c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9813c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9814c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SGET_OBJECT_VOLATILE */
9815c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9816c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
9817c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * Continuation if the field has not yet been resolved.
9818c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *  r1: BBBB field ref
9819c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
9820c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_OBJECT_VOLATILE_resolve:
9821c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9822c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
9823c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9824c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9825c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ success?
9826c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_SGET_OBJECT_VOLATILE_finish          @ yes, finish
9827c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown      @ no, handle exception
9828c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9829c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* continuation for OP_SPUT_OBJECT_VOLATILE */
9830b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
9831919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    mov     r2, rINST, lsr #8           @ r2<- AA
9832919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9833919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_VREG(r1, r2)                    @ r1<- fp[AA]
9834919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    ldr     r2, [rGLUE, #offGlue_cardTable]  @ r2<- card table base
9835b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
9836919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9837919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    SMP_DMB                            @ releasing store
9838b78c76f88ea42e7a3b295c210ca9ee86e7290043buzbee    str     r1, [r0, #offStaticField_value]  @ field<- vAA
9839919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r1, #0                      @ stored a null object?
9840d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
9841919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    GOTO_OPCODE(ip)                     @ jump to next instruction
9842c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
9843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
9844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterEnd
9845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd:
9846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/footer.S */
9848ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Common subroutines and data
9852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9855ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9856ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
9858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
9859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9860ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
986197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
986297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpPunt
986397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpPunt:
9864d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
986597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
9866d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9867d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9868d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
986997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
987097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpSingleStep
987197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpSingleStep:
9872d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    lr,[rGLUE,#offGlue_jitResumeNPC]
9873d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r1,[rGLUE,#offGlue_jitResumeDPC]
987497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
9875d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
987697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
98777a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .global dvmJitToInterpNoChainNoProfile
98787a2697d327936e20ef5484f7819e2e4bf91c891fBen ChengdvmJitToInterpNoChainNoProfile:
98797a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
98807a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r0,rPC                       @ pass our target PC
98817a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
98827a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
98837a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ back to the interp land
98847a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    b      jitSVShadowRunEnd            @ doesn't return
98857a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
988640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
988740094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
9888d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
988940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC                       @ pass our target PC
98907a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
98917a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
9892d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9893d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
989440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng
989540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
989640094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
9897d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
98989a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
989997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
99007a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
9901d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9902d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
990397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
990440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpBackwardBranch
990540094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpBackwardBranch:
9906d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
99079a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
990897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
99097a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
9910d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9911d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
991297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
991397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNormal
991497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNormal:
9915d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
99169a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
991797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
99187a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
9919d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9920d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
992197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
992297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNoChain
992397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNoChain:
9924d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
992597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r0,rPC                       @ pass our target PC
992697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
99277a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
9928d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9929d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
993097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
9931ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9932ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter when the compiler is
9933ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * having issues translating/executing a Dalvik instruction. We have to skip
9934ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the code cache lookup otherwise it is possible to indefinitely bouce
9935ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * between the interpreter and the code cache if the instruction that fails
9936ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to be compiled happens to be at a trace start.
9937ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9938ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpPunt
9939ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpPunt:
99407a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
9941ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC, r0
9942978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
9943ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,lr
9944ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpPunt;
9945ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9946ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
99477a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov    r0, #0
99487a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9949ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9950ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9951ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9952ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9953ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9954ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9955ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return to the interpreter to handle a single instruction.
9956ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * On entry:
9957ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r0 <= PC
9958ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r1 <= PC of resume instruction
9959ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    lr <= resume point in translation
9960ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9961ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpSingleStep
9962ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpSingleStep:
9963d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    lr,[rGLUE,#offGlue_jitResumeNPC]
9964d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r1,[rGLUE,#offGlue_jitResumeDPC]
9965ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#kInterpEntryInstr
9966ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ enum is 4 byte in aapcs-EABI
9967ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r1, [rGLUE, #offGlue_entryPoint]
9968ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC,r0
9969ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
99707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng
9971ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9972ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r2,#kJitSingleStep     @ Ask for single step and then revert
9973ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r2,[rGLUE,#offGlue_jitState]
9974ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#1                  @ set changeInterp to bail to debug interp
9975ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b      common_gotoBail
9976ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
997740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
997840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * Return from the translation cache and immediately request
997940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * a translation for the exit target.  Commonly used for callees.
998040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
998140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
998240094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
9983978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
998440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmBumpNoChain
998540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng#endif
998640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
998740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC
998840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
998940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
999040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r1, rPC                  @ arg1 of translation may need this
999140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
99927a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp    r0,#0                    @ !0 means translation exists
999340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bxne   r0                       @ continue native execution if so
99947a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    b      2f                       @ branch over to use the interpreter
9995ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9996ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9997ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache and immediately request
9998ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a translation for the exit target.  Commonly used following
9999ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * invokes.
10000ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
1000140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
1000240094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
100039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
100047a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
100059a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
10006bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee    add    rINST, #-4              @  .. which is 9 bytes back
10007ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
100087a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    bl     dvmJitGetCodeAddr       @ Is there a translation?
100097a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
10010ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
10011ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq    2f
10012ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
10013ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
100149a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
100159a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
1001646cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
1001746cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
1001846cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
10019ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10020ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* No translation, so request one if profiling isn't disabled*/
10021ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng2:
100221da12167d913efde56ec3b40491524b051679f2cAndy McFadden    adrl   rIBASE, dvmAsmInstructionStart
10023ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10024ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
10025ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0, #0
1002640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
10027ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne    common_selectTrace
10028ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
10029ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
10030ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10031ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
10032ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter.
10033ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The return was done with a BLX from thumb mode, and
10034ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the following 32-bit word contains the target rPC value.
10035ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Note that lr (r14) will have its low-order bit set to denote
10036ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * its thumb-mode origin.
10037ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
10038ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We'll need to stash our lr origin away, recover the new
10039ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * target and then check to see if there is a translation available
10040ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for our new target.  If so, we do a translation chain and
10041ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * go back to native execution.  Otherwise, it's back to the
10042ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * interpreter (after treating this entry as a potential
10043ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace start).
10044ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
10045ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNormal
10046ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNormal:
100479a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
100487a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
100499a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
10050bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee    add    rINST,#-4               @ .. which is 9 bytes back
10051978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
10052ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNormal
10053ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10054ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
10055ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
100567a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
10057ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
1005846cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    beq    toInterpreter            @ go if not, otherwise do chain
10059ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
10060ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
100619a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
100629a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
1006346cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
1006446cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
1006546cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
10066ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10067ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
10068ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter to do method invocation.
10069ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Check if translation exists for the callee, but don't chain to it.
10070ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
100717a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .global dvmJitToInterpNoChainNoProfile
100727a2697d327936e20ef5484f7819e2e4bf91c891fBen ChengdvmJitToInterpNoChainNoProfile:
100737a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#if defined(WITH_JIT_TUNING)
100747a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    bl     dvmBumpNoChain
100757a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#endif
100767a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
100777a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r0,rPC
100787a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
100797a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
100807a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r1, rPC                  @ arg1 of translation may need this
100817a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
100827a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp    r0,#0
100837a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    bxne   r0                       @ continue native execution if so
100847a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    EXPORT_PC()
100857a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    adrl   rIBASE, dvmAsmInstructionStart
100867a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    FETCH_INST()
100877a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
100887a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
100897a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
100907a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng/*
100917a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng * Return from the translation cache to the interpreter to do method invocation.
100927a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng * Check if translation exists for the callee, but don't chain to it.
100937a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng */
10094ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNoChain
10095ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNoChain:
10096978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
10097ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNoChain
10098ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
100997a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
10100ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
10101ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
101027a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
101039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
101049a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
10105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
10106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne   r0                       @ continue native execution if so
1010797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
10108ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10109ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
10110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * No translation, restore interpreter regs and start interpreting.
10111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * rGLUE & rFP were preserved in the translated code, and rPC has
10112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * already been restored by the time we get here.  We'll need to set
10113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * up rIBASE & rINST, and load the address of the JitTable into r0.
10114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
1011546cd5b63c29d3284a9ff3e0d0711fb136f409313Bill BuzbeetoInterpreter:
10116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
10117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
10118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
10119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ NOTE: intended fallthrough
101217a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
10122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
10123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Common code to update potential trace start counter, and initiate
10124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a trace-build if appropriate.  On entry, rPC should point to the
10125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * next instruction to execute, and rINST should be already loaded with
10126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the next opcode word, and r0 holds a pointer to the jit profile
10127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * table (pJitProfTable).
10128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
10129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_testUpdateProfile:
10130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10131ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
10132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFEQ(ip)       @ if not profiling, fallthrough otherwise */
10133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10134ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_updateProfile:
10135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
101367b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
101377b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
10138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
10139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    r1,r1,#1           @ decrement counter
101407b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
10141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
10142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
10144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Here, we switch to the debug interpreter to request
10145ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace selection.  First, though, check to see if there
10146ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * is already a native translation in place (and, if so,
10147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * jump to it now).
10148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
10149d726991ba52466cde88e37aba4de2395b62477faBill Buzbee    GET_JIT_THRESHOLD(r1)
101507a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self
101517b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
10152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
10153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0,rPC
10154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
101557a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
101567a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r1, rPC                     @ arg1 of translation may need this
101577a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
10158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1015997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
10160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    r0                          @ jump to the translation
1016140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     r2,#kJitTSelectRequest      @ ask for trace selection
1016240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    @ fall-through to common_selectTrace
1016397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
1016440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
101659a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    beq     common_selectTrace
101669a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
101679a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * At this point, we have a target translation.  However, if
101689a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * that translation is actually the interpret-only pseudo-translation
101699a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * we want to treat it the same as no translation.
101709a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
10171d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov     r10, r0                     @ save target
101729a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bl      dvmCompilerGetInterpretTemplate
10173d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    cmp     r0, r10                     @ special case?
10174d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bne     jitSVShadowRunStart         @ set up self verification shadow space
101754934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng    @ Need to clear the inJitCodeCache flag
101764934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ r10 <- glue->self
101774934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng    mov    r3, #0                       @ 0 means not in the JIT code cache
101784934b377d9cf5df6f80da7caab4f2178c6cec307Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ back to the interp land
101799a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GET_INST_OPCODE(ip)
101809a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GOTO_OPCODE(ip)
101819a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /* no return */
1018297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
101839a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
1018440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
1018540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * On entry:
1018640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
1018740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
10188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_selectTrace:
10189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r2,[rGLUE,#offGlue_jitState]
101909c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    mov     r2,#kInterpEntryInstr       @ normal entry reason
101919c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    str     r2,[rGLUE,#offGlue_entryPoint]
10192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1,#1                       @ set changeInterp
10193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b       common_gotoBail
10194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1019597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
1019697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
1019797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Save PC and registers to shadow memory for self verification mode
1019897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping to native translation.
10199d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * On entry:
10200d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng *    rPC, rFP, rGLUE: the values that they should contain
10201d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng *    r10: the address of the target translation.
1020297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
10203d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunStart:
1020497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r0,rPC                      @ r0<- program counter
1020597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r1,rFP                      @ r1<- frame pointer
1020697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r2,rGLUE                    @ r2<- InterpState pointer
102079a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r3,r10                      @ r3<- target translation
1020897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl      dvmSelfVerificationSaveState @ save registers to shadow space
10209ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
10210ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    add     rGLUE,r0,#offShadowSpace_interpState @ rGLUE<- rGLUE in shadow space
10211ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    bx      r10                         @ jump to the translation
1021297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1021397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
1021497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Restore PC, registers, and interpState to original values
1021597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping back to the interpreter.
1021697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
10217d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunEnd:
1021897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,rFP                        @ pass ending fp
1021997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
10220ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rPC,[r0,#offShadowSpace_startPC] @ restore PC
10221ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rFP,[r0,#offShadowSpace_fp]   @ restore FP
10222ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rGLUE,[r0,#offShadowSpace_glue] @ restore InterpState
10223ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
1022497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    cmp    r1,#0                         @ check for punt condition
1022597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    beq    1f
1022697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kJitSelfVerification      @ ask for self verification
1022797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    str    r2,[rGLUE,#offGlue_jitState]
1022830f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    mov    r2,#kInterpEntryInstr         @ normal entry reason
1022930f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    str    r2,[rGLUE,#offGlue_entryPoint]
1023097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,#1                         @ set changeInterp
1023197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      common_gotoBail
1023297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1023397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao1:                                       @ exit to interpreter without check
1023497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    EXPORT_PC()
1023597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    adrl   rIBASE, dvmAsmInstructionStart
1023697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    FETCH_INST()
1023797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GET_INST_OPCODE(ip)
1023897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GOTO_OPCODE(ip)
1023997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
1024097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
10241ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backward branch is taken.
10245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10246c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * TODO: we could avoid a branch by just setting r0 and falling through
10247c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * into the common_periodicChecks code, and having a test on r0 at the
10248c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * end determine if we should return to the caller or update & branch to
10249c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the next instr.
10250c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *
10251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is PC adjustment *in bytes*
10253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
10255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryInstr
10256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
10260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
10263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
10264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
10266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10268ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Need to see if the thread needs to be suspended or debugger/profiler
10273c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * activity has begun.  If so, we suspend the thread or side-exit to
10274c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the debug interpreter as appropriate.
10275c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *
10276c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * The common case is no activity on any of these, so we want to figure
10277c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * that out quickly.  If something is up, we can then sort out what.
10278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10279c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * We want to be fast if the VM was built without debugger or profiler
10280c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * support, but we also need to recognize that the system is usually
10281c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * shipped with both of these enabled.
10282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: reduce this so we're just checking a single location.
10284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10286c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *  r0 is reentry type, e.g. kInterpEntryInstr (for debugger/profiling)
10287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is trampoline PC adjustment *in bytes*
10288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
10290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_pSelfSuspendCount] @ r3<- &suspendCount
10291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_pDebuggerActive]   @ r1<- &debuggerActive
10293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_pActiveProfilers]  @ r2<- &activeProfilers
10294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10295c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     ip, [r3]                    @ ip<- suspendCount (int)
10296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10297c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     r1, #0                      @ debugger enabled?
10298c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldrneb  r1, [r1]                    @ yes, r1<- debuggerActive (boolean)
10299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
10300c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrne   ip, ip, r1                  @ ip<- suspendCount | debuggerActive
10301c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrs    ip, ip, r2                  @ ip<- suspend|debugger|profiler; set Z
10302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10303c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    bxeq    lr                          @ all zero, return
10304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10305c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    /*
10306c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * One or more interesting events have happened.  Figure out what.
10307c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     *
10308c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * If debugging or profiling are compiled in, we need to disambiguate.
10309c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     *
10310c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * r0 still holds the reentry type.
10311c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     */
10312c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     ip, [r3]                    @ ip<- suspendCount (int)
10313c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     ip, #0                      @ want suspend?
10314c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    beq     1f                          @ no, must be debugger/profiler
10315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10316c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    stmfd   sp!, {r0, lr}               @ preserve r0 and lr
10317964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10318964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    /*
10319964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * Refresh the Jit's cached copy of profile table pointer.  This pointer
10320964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * doubles as the Jit's on/off switch.
10321964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     */
10322d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ r3<-&gDvmJit.pJitProfTable
10323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
10324d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r3, [r3] @ r3 <- pJitProfTable
103253a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    EXPORT_PC()                         @ need for precise GC
10326964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh Jit's on/off switch
10327964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#else
10328964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
10329964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    EXPORT_PC()                         @ need for precise GC
10330964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10331c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    bl      dvmCheckSuspendPending      @ do full check, suspend if necessary
10332c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldmfd   sp!, {r0, lr}               @ restore r0 and lr
10333c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10334c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    /*
10335c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * Reload the debugger/profiler enable flags.  We're checking to see
10336c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * if either of these got set while we were suspended.
10337c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     *
10338c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * We can't really avoid the #ifdefs here, because the fields don't
10339c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * exist when the feature is disabled.
10340c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     */
10341c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     r1, [rGLUE, #offGlue_pDebuggerActive]   @ r1<- &debuggerActive
10342c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     r1, #0                      @ debugger enabled?
10343c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldrneb  r1, [r1]                    @ yes, r1<- debuggerActive (boolean)
10344c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     r2, [rGLUE, #offGlue_pActiveProfilers]  @ r2<- &activeProfilers
10345c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
10346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10347c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrs    r1, r1, r2
10348c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    beq     2f
10349c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10350c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden1:  @ debugger/profiler enabled, bail out; glue->entryPoint was set above
10351c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    str     r0, [rGLUE, #offGlue_entryPoint]    @ store r0, need for debug/prof
10352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, rPC, r9                @ update rPC
10353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ "want switch" = true
10354c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    b       common_gotoBail             @ side exit
10355c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10356c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden2:
10357c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    bx      lr                          @ nothing to do, return
10358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The equivalent of "goto bail", this calls through the "bail handler".
10362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * State registers will be saved to the "glue" area before bailing.
10364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1 is "bool changeInterp", indicating if we want to switch to the
10367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     other interpreter or just bail all the way out
10368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
10370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
10371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ r0<- glue ptr
10372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       dvmMterpStdBail             @ call(glue, changeInterp)
10373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r1, r1, #1                  @ using (boolean+1)
10375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r0, rGLUE, #offGlue_jmpBuf  @ r0<- &glue->jmpBuf
10376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      _longjmp                    @ does not return
10377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_abort
10378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation with range.
10382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
10385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodRange:
10387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewRange:
10388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
10389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
10390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
10391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LinvokeArgsDone            @ if no args, skip the rest
10392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- CCCC
10393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
10395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (very few methods have > 10 args; could unroll for common cases)
10396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
10397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
103983a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
10399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r1, [r3], #4                @ val = *fp++
10400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r2, r2, #1                  @ count--
10401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r10], #4               @ *outs++ = val
10402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1b                          @ ...while count != 0
104033a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldrh    r3, [r0, #offMethod_outsSize]   @ r3<- methodToCall->outsSize
10404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LinvokeArgsDone
10405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation without range.
10408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
10411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodNoRange:
10413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewNoRange:
10414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
10415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
10416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
104173a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
104183a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
104193a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
104203a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    beq     .LinvokeArgsDone
10421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104223a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    @ r0=methodToCall, r1=GFED, r3=outSize, r2=count, r9=regSize, r10=outs
10423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNonRange:
10424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r2, r2, #5                  @ r2<- 5-r2
10425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
10426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
10427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project5:  and     ip, rINST, #0x0f00          @ isolate A
104283a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
10429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
104303a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    str     r2, [r10, #-4]!             @ *--outs = vA
10431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r1, #0xf000             @ isolate G
104323a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
10433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
104343a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    str     r2, [r10, #-4]!             @ *--outs = vG
10435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r1, #0x0f00             @ isolate F
104363a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
10437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
104383a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    str     r2, [r10, #-4]!             @ *--outs = vF
10439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r1, #0x00f0             @ isolate E
104403a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
10441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
104423a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    str     r2, [r10, #-4]!             @ *--outs = vE
10443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r1, #0x000f             @ isolate D
104443a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
10445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
104463a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    str     r2, [r10, #-4]!             @ *--outs = vD
10447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  @ fall through to .LinvokeArgsDone
10448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104493a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.LinvokeArgsDone: @ r0=methodToCall, r3=outSize, r9=regSize
104503a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
104513a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
10452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ find space for the new stack frame, check for overflow
10453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
104543a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
10455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
10456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@    bl      common_dumpRegs
10457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
10458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
10459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, r9                      @ bottom < interpStackEnd?
104603a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
104617a44e4ee0782d24b4c6090be1f0a3c66f971f2c1Andy McFadden    blo     .LstackOverflow             @ yes, this frame will overflow stack
10462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ set up newSaveArea
10464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB
10465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
10466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [r10, #offStackSaveArea_prevSave]
10467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r10, #offStackSaveArea_prevFrame]
10469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rPC, [r10, #offStackSaveArea_savedPc]
10470ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10471ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, #0
10472ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r9, [r10, #offStackSaveArea_returnAddr]
10473ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r10, #offStackSaveArea_method]
10475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    tst     r3, #ACC_NATIVE
10476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LinvokeNative
10477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
10480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
10481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP
10482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
10484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
10485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
10486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1
10487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
10488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
10489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
10490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
10491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
10492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104933a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
104943a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
104953a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     rPC, r2                         @ publish new rPC
104963a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
104973a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden
10498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Update "glue" values for the new method
104993a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    @ r0=methodToCall, r1=newFp, r2=self, r3=newMethodClass, r9=newINST
10500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
10501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
10502ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10503ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r1                         @ fp = newFp
105053a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
105063a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     rINST, r9                       @ publish new rINST
10507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
10508ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10509ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                         @ jump to next instruction
10511ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10512ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
10513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
10514ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rINST, r9                       @ publish new rINST
10515ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
10516ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                         @ jump to next instruction
10517ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNative:
10520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Prep for the native call
10521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=newFp, r10=newSaveArea
10522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
10523d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
10524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
10525d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
10526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r3                      @ r9<- glue->self (preserve)
10527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ r2<- methodToCall
10529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                      @ r0<- newFp (points to args)
10530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
10531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
10533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
10534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .Lskip
10535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_mterp, %function
10536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_mterp:
10537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
10538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
10539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
10540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lskip:
10541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @mov     lr, pc                      @ set return addr
10544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
10545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC_LR "[r2, #offMethod_nativeFunc]"
10546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10547964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10548964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ Refresh Jit's on/off status
10549964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10550964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
10551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ native return; r9=self, r10=newSaveArea
10552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ equivalent to dvmPopJniLocals
10553d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
10554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offThread_exception] @ check for exception
10555964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10556964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3]                    @ r3 <- gDvmJit.pProfTable
10557964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
10559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null?
10560d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
10561964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10562964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh cached on/off switch
10563964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ no, handle exception
10565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105706ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    @ r0=methodToCall
105716ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    mov     r1, r0                      @ r1<- methodToCall
10572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- self
10573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmHandleStackOverflow
10574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
10576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
10577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Common code for method invocation, calling through "glue code".
10582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TODO: now that we have range and non-range invoke handlers, this
10584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       needs to be split into two.  Maybe just create entry points
10585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       that set r9 and jump here?
10586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
10588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 is "Method* methodToCall", the method we're trying to call
10589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 is "bool methodCallRange", indicating if this is a /range variant
10590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
10592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeOld:
10593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #8                  @ space for args + pad
10594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
10595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ A2<- methodToCall
10596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ A0<- glue
10597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
10598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ A1<- methodCallRange
10599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ A3<- AA
10600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #0]                @ A4<- ip
10601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
10602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ remove arg area
10603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall  @ continue to next instruction
10604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction.
10610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
10612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
10614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnNew:
10615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryReturn
10616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
10617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
10620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
106213a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
10622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
10623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        @ r2<- method we're returning to
106243a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
10625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is this a break frame?
106263a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
10627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
10628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_gotoBail             @ break frame, bail out completely
10629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106303a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
106313a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
106323a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
10633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r3, #offThread_curFrame]  @ self->curFrame = fp
10634ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
106357a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
10636ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rPC, r9                     @ publish new rPC
10637ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [rGLUE, #offGlue_methodClassDex]
106387a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r10, [r3, #offThread_inJitCodeCache]  @ may return to JIT'ed land
106397a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    cmp     r10, #0                      @ caller is compiled code
106407a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    blxne   r10
10641ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10642ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
10643ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
106453a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     rPC, r9                     @ publish new rPC
10646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_methodClassDex]
10647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10648ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return handling, calls through "glue code".
10652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
10654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnOld:
10655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
10656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
10657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_returnFromMethod
10658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
10659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
10664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
10666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
10667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
10668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
10670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     .global dvmMterpCommonExceptionThrown
10672ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmMterpCommonExceptionThrown:
10673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
10674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionNew:
10675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryThrow
10676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
10677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r10, [rGLUE, #offGlue_self] @ r10<- glue->self
10680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r10, #offThread_exception] @ r9<- self->exception
10681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
10684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- NULL
10685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r10, #offThread_exception] @ self->exception = NULL
10686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up args and a local for "&fp" */
10688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
10689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [sp, #-4]!             @ *--sp = fp
10690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     ip, sp                      @ ip<- &fp
10691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- false
10692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #-4]!              @ *--sp = &fp
10693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_method] @ r1<- glue->method
10694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
10695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
10696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r9                      @ r2<- exception
10697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1                 @ r1<- pc - method->insns
10698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #1              @ r1<- offset in code units
10699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call, r0 gets catchRelPc (a code-unit offset) */
10701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
10702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix earlier stack overflow if necessary; may trash rFP */
10704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
10705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
10706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ no, skip ahead
10707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r0                     @ save relPc result in rFP
10708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
107094fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    mov     r1, r9                      @ r1<- exception
10710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCleanupStackOverflow     @ call(self)
10711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP                     @ restore result
10712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
10713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* update frame pointer and check result from dvmFindCatchBlock */
10715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
10716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is catchRelPc < 0?
10717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ restore stack
10718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     .LnotCaughtLocally
10719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* adjust locals to match self->curFrame and updated PC */
10721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
10722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
10723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_method]    @ glue->method = new method
10724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
10725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
10726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
10727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
10728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r2, [rGLUE, #offGlue_methodClassDex] @ glue->pDvmDex = meth...
10729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* release the tracked alloc on the exception */
10731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
10734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* restore the exception if the handler wants it */
10736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
10737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
10739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    streq   r9, [r10, #offThread_exception] @ yes, restore the exception
10740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LnotCaughtLocally: @ r9=exception, r10=self
10743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix stack overflow if necessary */
10744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
10745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
10746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, r10                     @ if yes: r0<- self
107474fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    movne   r1, r9                      @ if yes: r1<- exception
10748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blne    dvmCleanupStackOverflow     @ if yes: call(self)
10749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ may want to show "not caught locally" debug messages here
10751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if DVM_SHOW_EXCEPTION >= 2
10752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call __android_log_print(prio, tag, format, ...) */
10753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* "Exception %s from %s:%d not caught locally" */
10754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmLineNumFromPC(method, pc - method->insns)
10755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
10756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_insns]
10757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1
10758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    asr     r1, r1, #1
10759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLineNumFromPC
10760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
10761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmGetMethodSourceFile(method)
10762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
10763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmGetMethodSourceFile
10764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
10765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ exception->clazz->descriptor
10766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]
10767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_descriptor]
10768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @
10769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, strExceptionNotCaughtLocally
10770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strLogTag
10771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #3                      @ LOG_DEBUG
10772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __android_log_print
10773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offThread_exception] @ restore exception
10775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
10778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
10779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_gotoBail             @ bail out
10780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exception handling, calls through "glue code".
10784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
10786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionOld:
10787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
10788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
10789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_exceptionThrown
10790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
10791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated
10796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values and start executing at the next instruction.
10797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_resumeAfterGlueCall:
10799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FP_FROM_GLUE()              @ pull rPC and rFP out of glue
10800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
10801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array index.
10806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
10808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayIndexException
10810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
10816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
10818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayStoreException
10820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero.
10826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
10828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArithmeticException
10830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strDivideByZero
10831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
10836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
10838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNegativeArraySizeException
10840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation of a non-existent method.
10846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
10848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNoSuchMethodError
10850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We encountered a null object when we weren't expecting one.  We
10856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * export the PC, throw a NullPointerException, and goto the exception
10857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * processing code.
10858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
10860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNullPointerException
10862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For debugging, cause an immediate fault.  The source address will
10868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be in lr (use a bl instruction to jump here).
10869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
10871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, .LdeadFood
10872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LdeadFood:
10873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xdeadf00d
10874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out a "we were here", preserving all registers.  (The attempt
10877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to save ip won't work, but we need to save an even number of
10878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers for EABI 64-bit stack alignment.)
10879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .macro  SQUEAK num
10881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_squeak\num:
10882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
10884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #\num
10885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endm
10889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  0
10891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  1
10892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  2
10893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  3
10894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  4
10895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  5
10896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out the number in r0, preserving registers.
10899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNum:
10901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
10903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
10904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a newline, preserving registers.
10910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNewline:
10912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNewline
10914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
10920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printHex:
10922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
10924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintHex
10925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 64-bit quantity in r0-r1, preserving registers.
10931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printLong:
10933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r1
10935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0
10936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintLong
10937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print full method info.  Pass the Method* in r0.  Preserves regs.
10943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printMethod:
10945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpPrintMethod
10947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Call a C helper function that dumps regs and possibly some
10952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional info.  Requires the C function to be compiled in.
10953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
10955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_dumpRegs:
10956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpDumpArmRegs
10958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10962d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#if 0
10963d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden/*
10964d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Experiment on VFP mode.
10965d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10966d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * uint32_t setFPSCR(uint32_t val, uint32_t mask)
10967d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10968d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Updates the bits specified by "mask", setting them to the values in "val".
10969d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden */
10970d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddensetFPSCR:
10971d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r0, r0, r1                  @ make sure no stray bits are set
10972d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmrx    r2, fpscr                   @ get VFP reg
10973d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mvn     r1, r1                      @ bit-invert mask
10974d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r2, r2, r1                  @ clear masked bits
10975d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    orr     r2, r2, r0                  @ set specified bits
10976d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmxr    fpscr, r2                   @ set VFP reg
10977d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, r2                      @ return new value
10978d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bx      lr
10979d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10980d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .align  2
10981d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .global dvmConfigureFP
10982d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .type   dvmConfigureFP, %function
10983d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddendvmConfigureFP:
10984d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    stmfd   sp!, {ip, lr}
10985d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x03000000 sets DN/FZ */
10986d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x00009f00 clears the six exception enable flags */
10987d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      common_squeak0
10988d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, #0x03000000             @ r0<- 0x03000000
10989d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
10990d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      setFPSCR
10991d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    ldmfd   sp!, {ip, pc}
10992d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#endif
10993d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references, must be close to the code that uses them.
10997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
10999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArithmeticException:
11000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArithmeticException
11001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayIndexException:
11002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayIndexException
11003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayStoreException:
11004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayStoreException
11005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrDivideByZero:
11006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrDivideByZero
11007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNegativeArraySizeException:
11008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNegativeArraySizeException
11009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNoSuchMethodError:
11010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNoSuchMethodError
11011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNullPointerException:
11012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNullPointerException
11013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrLogTag:
11015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrLogTag
11016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrExceptionNotCaughtLocally:
11017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrExceptionNotCaughtLocally
11018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNewline:
11020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNewline
11021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrSqueak:
11022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrSqueak
11023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintHex:
11024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintHex
11025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintLong:
11026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintLong
11027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
11029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Zero-terminated ASCII string data.
11030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On ARM we have two choices: do like gcc does, and LDR from a .word
11032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the address, or use an ADR pseudo-op to get the address
11033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * directly.  ADR saves 4 bytes and an indirection, but it's using a
11034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PC-relative addressing mode and hence has a limited range, which
11035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it not work well with mergeable string sections.
11036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
11037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section .rodata.str1.4,"aMS",%progbits,1
11038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
11040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
11041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
11042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
11043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
11044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
11045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
11046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
11047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
11048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
11049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
11050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
11051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
11052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for objects and 'int'"
11053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
11054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
11055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
11056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
11057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
11058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
11059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
11060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
11061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
11062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NullPointerException;"
11063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrLogTag:
11065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "mterp"
11066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrExceptionNotCaughtLocally:
11067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Exception %s from %s:%d not caught locally\n"
11068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNewline:
11070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "\n"
11071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrSqueak:
11072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%d>"
11073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintHex:
11074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<0x%x>"
11075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintLong:
11076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%lld>"
11077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11078