InterpAsm-armv5te.S revision 978738d2cbf9d08fa78c65762eaac3351ab76b9a
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This file was generated automatically by gen-mterp.py for 'armv5te'.
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * --> DO NOT EDIT <--
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/header.S */
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ARMv5 definitions and declarations.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectARM EABI general notes:
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r3 hold first 4 args to a method; they are not preserved across method calls
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr4-r8 are available for general use
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr9 is given special treatment in some situations, but not for us
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr10 (sl) seems to be generally available
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr12 (ip) is scratch -- not preserved across method calls
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr13 (sp) should be managed carefully in case a signal arrives
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr14 (lr) must be preserved
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr15 (pc) can be tinkered with directly
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0 holds returns of <= 4 bytes
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r1 hold returns of 8 bytes, low word in r0
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenCallee must save/restore r4+ (except r12) if it modifies them.  If VFP
44a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenis present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
45a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddens0-s15 (d0-d7, q0-a3) do not need to be.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectStack is "full descending".  Only the arguments that don't fit in the first 4
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectregisters are placed on the stack.  "sp" points at the first stacked argument
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project(i.e. the 5th arg).
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectVFP: single-precision results in s0, double-precision results in d0.
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectIn the EABI, "sp" must be 64-bit aligned on entry to a function, and any
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project64-bit quantities (long long, double) must be 64-bit aligned.
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMterp and ARM notes:
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe following registers have fixed assignments:
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  reg nick      purpose
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r4  rPC       interpreted program counter, used for fetching instructions
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r5  rFP       interpreted frame pointer, used for accessing locals and args
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r6  rGLUE     MterpGlue pointer
661da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r7  rINST     first 16-bit code unit of current instruction
671da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r8  rIBASE    interpreted instruction base pointer, used for computed goto
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMacros are provided for common operations.  Each macro MUST emit only
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectone instruction to make instruction-counting easier.  They MUST NOT alter
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunspecified registers or condition codes.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* single-purpose registers, given names for clarity */
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rPC     r4
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rFP     r5
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rGLUE   r6
781da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rINST   r7
791da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rIBASE  r8
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* save/restore the PC and/or FP from the glue struct */
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_PC_FROM_GLUE()     ldr     rPC, [rGLUE, #offGlue_pc]
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_PC_TO_GLUE()       str     rPC, [rGLUE, #offGlue_pc]
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_FP_FROM_GLUE()     ldr     rFP, [rGLUE, #offGlue_fp]
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_FP_TO_GLUE()       str     rFP, [rGLUE, #offGlue_fp]
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOAD_PC_FP_FROM_GLUE()  ldmia   rGLUE, {rPC, rFP}
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVE_PC_FP_TO_GLUE()    stmia   rGLUE, {rPC, rFP}
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "export" the PC to the stack frame, f/b/o future exception objects.  Must
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be done *before* something calls dvmThrowException.
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It's okay to do this more than once.
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EXPORT_PC() \
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a frame pointer, find the stack save area.
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "((StackSaveArea*)(_fp) -1)".
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVEAREA_FROM_FP(_reg, _fpreg) \
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     _reg, _fpreg, #sizeofStackSaveArea
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_INST()            ldrh    rINST, [rPC]
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from the specified offset.  Advances rPC
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to point to the next instruction.  "_count" is in 16-bit code units.
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Because of the limited size of immediate constants on ARM, this is only
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * suitable for small forward movements (i.e. don't try to implement "goto"
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with this).
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This must come AFTER anything that can throw an exception, or the
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception catch may miss.  (This also implies that it must come after
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EXPORT_PC().)
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #(_count*2)]!
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
129642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * The operation performed here is similar to FETCH_ADVANCE_INST, except the
130642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * src and dest registers are parameterized (not hard-wired to rPC and rINST).
131642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */
132642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
133642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng        ldrh    _dreg, [_sreg, #(_count*2)]!
134642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
135642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/*
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from an offset specified by _reg.  Updates
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rPC to point to the next instruction.  "_reg" must specify the distance
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in bytes, *not* 16-bit code units, and may be a signed value.
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We want to write "ldrh rINST, [rPC, _reg, lsl #2]!", but some of the
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bits that hold the shift distance are used for the half/byte/sign flags.
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In some cases we can pre-double _reg for free, so we require a byte offset
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * here.
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch a half-word code unit from an offset past the current PC.  The
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" value is in 16-bit code units.  Does not advance rPC.
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "_S" variant works the same but treats the value as signed.
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #(_count*2)]
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #(_count*2)]
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch one byte from an offset past the current PC.  Pass in the same
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" as you would for FETCH, and an additional 0/1 indicating which
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * byte of the halfword you want (lo/hi).
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #(_count*2+_byte)]
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Put the instruction's opcode field into the specified register.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
169642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * Put the prefetched instruction's opcode field into the specified register.
170642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */
171642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
172642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
173642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/*
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Begin executing the opcode in _reg.  Because this only jumps within the
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the 32-bit value from a Dalvik register.
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GET_JIT_PROF_TABLE(_reg)    ldr     _reg,[rGLUE,#offGlue_pJitProfTable]
189d726991ba52466cde88e37aba4de2395b62477faBill Buzbee#define GET_JIT_THRESHOLD(_reg)     ldr     _reg,[rGLUE,#offGlue_jitThreshold]
190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert a virtual register index into an address.
194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden        add     _reg, rFP, _vreg, lsl #2
197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to expand the macros into assembler assignment statements.
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "../common/asm-constants.h"
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2047b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#if defined(WITH_JIT)
2057b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#include "../common/jit-config.h"
2067b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#endif
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/platform.S */
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  CPU-version-specific defines
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDR PC,xxx", which is not allowed pre-ARMv5.  Essentially a
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one-way branch.
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP.  Does not modify LR.
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDR_PC source
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, \source
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "MOV LR,PC / LDR PC,xxx", which is not allowed pre-ARMv5.
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Jump to subroutine.
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP and LR.
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDR_PC_LR source
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     lr, pc
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, \source
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDMFD SP!, {...regs...,PC}".
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP and LR.
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDMFD_PC regs
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {\regs,pc}
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/entry.S */
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't have formal stack frames, so gdb scans upward in the code
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to find the start of the function (a label with the %function type),
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and then looks at the next few instructions to figure out what
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * got pushed onto the stack.  From this it figures out how to restore
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the registers, including PC, for the previous stack frame.  If gdb
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sees a non-function label, it stops scanning, so either we need to
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have nothing but assembler-local labels between the entry point and
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the break, or we need to fake it out.
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When this is defined, we add some stuff to make gdb less confused.
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ASSIST_DEBUGGER 1
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0  MterpGlue* glue
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This function returns a boolean "changeInterp" value.  The return comes
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * via a call to dvmMterpStdBail().
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY1 \
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .save {r4-r10,fp,lr}; \
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY2 \
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .pad    #4; \
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align 64
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* save stack pointer, add magic word for debuggerd */
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     sp, [r0, #offGlue_bailPtr]  @ save SP for eventual return
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up "named" registers, figure out entry point */
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rGLUE, r0                   @ set rGLUE
30951ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee    ldr     r1, [r0, #offGlue_entryPoint]   @ enum is 4 bytes in aapcs-EABI
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FP_FROM_GLUE()              @ load rPC and rFP from "glue"
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adr     rIBASE, dvmAsmInstructionStart  @ set rIBASE
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryInstr      @ usual case?
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .Lnot_instr                 @ no, handle it
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
315ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
316d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng.LentryInstr:
3177a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
318ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Entry is always a possible trace start */
319ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
320ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
3217a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov    r1, #0                       @ prepare the value for the new state
3227a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r1, [r10, #offThread_inJitCodeCache] @ back to the interp land
323ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
324ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne    common_updateProfile
325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
326ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
327ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* start executing the instruction at rPC */
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
332ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr:
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryReturn     @ were we returning from a method?
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_returnFromMethod
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_return:
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryThrow      @ were we throwing an exception?
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
342ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
343ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.Lnot_throw:
344d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r10,[rGLUE, #offGlue_jitResumeNPC]
345d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r2,[rGLUE, #offGlue_jitResumeDPC]
346ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #kInterpEntryResume     @ resuming after Jit single-step?
347ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .Lbad_arg
348ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     rPC,r2
349d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bne     .LentryInstr                @ must have branched, don't resume
350d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#if defined(WITH_SELF_VERIFICATION)
351d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    @ glue->entryPoint will be set in dvmSelfVerificationSaveState
352d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b       jitSVShadowRunStart         @ re-enter the translation after the
353d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng                                        @ single-stepped instruction
354d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    @noreturn
355d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#endif
356ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, #kInterpEntryInstr
35751ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee    str     r1, [rGLUE, #offGlue_entryPoint]
358d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bx      r10                         @ re-enter the translation
359ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
360ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lbad_arg:
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strBadEntryPoint
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r1 holds value of entryPoint
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAbort
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pushed some registers on the stack in dvmMterpStdRun, then saved
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SP and LR.  Here we restore SP, restore the registers, and then restore
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LR to PC.
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0  MterpGlue* glue
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1  bool changeInterp
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     sp, [r0, #offGlue_bailPtr]      @ sp<- saved SP
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                          @ return the changeInterp value
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4                      @ un-align 64
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDMFD_PC "r4-r10,fp"                    @ restore 9 regs and return
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references.
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrBadEntryPoint:
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrBadEntryPoint
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionStart
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmInstructionStart, %function
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOP.S */
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_inst, %function
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_inst:
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE.S */
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide vA, vB */
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- BBBB
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_16.S */
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- BBBB
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- AAAA
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
516445194bc141dc67e2f678aa1bbd5e59ca66254e5Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT.S */
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_16.S */
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-result-wide vAA */
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_EXCEPTION.S */
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-exception vAA */
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offThread_exception]  @ r3<- dvmGetException bypass
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ r1<- 0
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ dvmClearException bypass
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_VOID.S */
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_WIDE.S */
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 64-bit value.  Copies the return value into the "glue"
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* return-wide vAA */
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ retval<- r0/r1
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_OBJECT.S */
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
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/* ------------------------------ */
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_16.S */
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/16 vAA, #+BBBB */
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST.S */
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const vAA, #+BBBBbbbb */
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_HIGH16.S */
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsl #16             @ r0<- BBBB0000
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_16.S */
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_32.S */
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE.S */
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 4)                        @ r3<- HHHH (high)
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #0                      @ r0<- 00000000
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsl #16             @ r1<- BBBB0000
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING.S */
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBB */
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_resolve
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING_JUMBO.S */
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_JUMBO_resolve
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_CLASS.S */
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/class vAA, Class@BBBB */
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_CLASS_resolve
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_ENTER.S */
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Synchronize on an object.
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-enter vAA */
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
88499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         @ need for precise GC, MONITOR_TRACKING
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null object, throw an exception
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLockObject               @ call(self, obj)
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION /* implies WITH_MONITOR_TRACKING */
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offThread_exception] @ check for exception
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ exception raised, bail out
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_EXIT.S */
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlock an object.
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction spec.
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-exit vAA */
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ before fetch: export the PC
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
9146bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     1f                          @ yes
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
9196bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     common_exceptionThrown      @ yes, exception is pending
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9226bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee1:
9236bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    FETCH_ADVANCE_INST(1)               @ advance before throw
9246bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    b      common_errNullObject
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CHECK_CAST.S */
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* check-cast vAA, class@BBBB */
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- BBBB
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r3)                    @ r9<- object
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_methodClassDex]    @ r0<- pDvmDex
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ is object null?
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved:
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay:
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INSTANCE_OF.S */
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if an object reference is an instance of a class.
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Most common situation is a non-null object, being compared against
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an already-resolved class.
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15                 @ r9<- A
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- pDvmDex
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- CCCC
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ARRAY_LENGTH.S */
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the length of an array.
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yup, fail
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ vB<- length
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_INSTANCE.S */
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new instance of a class.
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-instance vAA, class@BBBB */
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for init, resolve, alloc
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved:   @ r0=class
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized: @ r0=class
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
1024b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    bl      dvmAllocObject              @ r0<- new object
1025b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    b       .LOP_NEW_INSTANCE_finish          @ continue
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_ARRAY.S */
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- CCCC
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r0)                    @ r1<- vB (array length)
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ check length
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_errNegativeArraySize @ negative length, bail
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for resolve, alloc
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_continue
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC();
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ 0 means an exception is thrown
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ has exception
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_THROW.S */
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception object in the current thread.
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* throw vAA */
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, throw an NPE instead
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ bypass dvmSetException, just store it
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ thread->exception<- obj
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO.S */
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 8-bit offset.
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto +AA */
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asr #24             @ r9<- ssssssAA (sign-extended)
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r9, lsl #1              @ r9<- byte offset
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_16.S */
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 16-bit offset.
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/16 +AAAA */
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- byte offset, check sign
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1198ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_32.S */
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 32-bit offset.
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * our "backward branch" test must be "<=0" instead of "<0".  The ORRS
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction doesn't affect the V flag, so we need to clear it
1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * explicitly.
1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/32 +AAAAAAAA */
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, ip                      @ (clear V flag during stall)
1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    r0, r0, r1, lsl #16         @ r0<- AAAAaaaa, check sign
1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0, asl #1              @ r9<- byte offset
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble     common_backwardBranch       @ backward branch, do periodic checks
1223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1265ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1266ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1267ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPARSE_SWITCH.S */
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1302ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1308ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1309ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1310ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish:
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_FLOAT.S */
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish:
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_DOUBLE.S */
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMP_LONG.S */
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register based on the results of the comparison.
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We load the full values with LDM, but in practice many values could
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be resolved by only looking at the high word.  This could be made
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * faster or slower by splitting the LDM into a pair of LDRs.
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If we just wanted to set condition flags, we could do this:
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subs    ip, r0, r2
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  sbcs    ip, r1, r3
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subeqs  ip, r0, r2
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * integer value, which we can do with 2 conditional mov/mvn instructions
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * us a constant 5-cycle path plus a branch at the end to the
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction epilogue code.  The multi-compare approach below needs
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the worst case (the 64-bit values are equal).
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt     .LOP_CMP_LONG_greater
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r1, r0, r2                  @ r1<- r0 - r2
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CMP_LONG_less
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQ.S */
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1557ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1558ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1559ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1560ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1561ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1562ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1563ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1566ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NE.S */
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1594ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1595ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1596ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1598ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1599ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1600ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LT.S */
1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1631ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1632ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1633ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1634ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1635ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1636ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1637ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1640ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GE.S */
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1668ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1669ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1670ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1672ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1673ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1677ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GT.S */
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1705ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1706ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1707ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1709ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1714ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LE.S */
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1742ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1745ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1746ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1747ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1748ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1751ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQZ.S */
1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1776ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1777ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1778ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1779ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1780ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1781ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1784ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1785ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1786ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1787ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1788ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NEZ.S */
1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1813ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1814ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1815ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1816ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1817ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1818ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1821ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1822ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1823ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1824ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1825ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */
1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LTZ.S */
1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1850ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1851ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1852ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1853ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1854ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1855ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1858ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1859ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1860ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1861ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1862ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */
1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GEZ.S */
1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1887ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1888ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1889ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1890ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1891ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1892ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1893ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1894ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1895ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1896ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1899ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GTZ.S */
1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1924ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1925ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1926ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1927ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1928ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1929ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1930ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1931ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1932ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1933ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1936ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LEZ.S */
1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1961ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1962ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1963ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1964ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1965ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1966ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1969ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1970ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1971ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1972ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1973ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3E.S */
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3F.S */
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_40.S */
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_41.S */
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_42.S */
2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_43.S */
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_WIDE.S */
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aget-wide vAA, vBB, vCC */
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_OBJECT.S */
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BOOLEAN.S */
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BYTE.S */
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_CHAR.S */
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_SHORT.S */
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_WIDE.S */
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 64 bits.  vBB[vCC] <- vAA.
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aput-wide vAA, vBB, vCC */
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_OBJECT.S */
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Store an object into an array.  vBB[vCC] <- vAA.
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vBB (array object)
2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null array object?
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r9)                    @ r9<- vAA
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offArrayObject_length]    @ r3<- arrayObj->length
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r1, r0, lsl #2         @ r10<- arrayObj + index*width
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r3                      @ compare unsigned index, length
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BOOLEAN.S */
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BYTE.S */
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_CHAR.S */
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_SHORT.S */
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish          @ no, already resolved
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE.S */
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Wide 32-bit instance field get.
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide vA, vB, field@CCCC */
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT.S */
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BOOLEAN.S */
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BYTE.S */
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_CHAR.S */
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_SHORT.S */
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ no, already resolved
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ yes, finish up
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE.S */
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide vA, vB, field@CCCC */
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT.S */
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BOOLEAN.S */
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BYTE.S */
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_CHAR.S */
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_SHORT.S */
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_resolve         @ yes, do resolve
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish: @ field ptr in r0
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_WIDE.S */
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:
2896861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2897861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
2898861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2899861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
2900861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
2901861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2902861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
2903861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2905861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_OBJECT.S */
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish: @ field ptr in r0
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BOOLEAN.S */
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BYTE.S */
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish: @ field ptr in r0
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_CHAR.S */
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish: @ field ptr in r0
3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_SHORT.S */
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish: @ field ptr in r0
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_resolve         @ yes, do resolve
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish:   @ field ptr in r0
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_WIDE.S */
3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SPUT handler.
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sput-wide vAA, field@BBBB */
3071861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]  @ r0<- DvmDex
3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3073861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
3075861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
3077861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
3079861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3081861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
3082861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
3083861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
3084861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
3085861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
3086861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
3087861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
3088861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
3089861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_OBJECT.S */
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BOOLEAN.S */
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BYTE.S */
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_CHAR.S */
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_SHORT.S */
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
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    FETCH(r1, 1)                        @ r1<- BBBB
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange   @ no, continue on
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ yes, continue on
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ no, continue
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_invokeMethodNoRange @ jump to common handler
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_73.S */
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange   @ no, continue on
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ yes, continue on
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ no, continue
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_invokeMethodRange @ jump to common handler
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_79.S */
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_7A.S */
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_INT.S */
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_INT.S */
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_LONG.S */
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_LONG.S */
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                           @ optional op; may set condition codes
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_FLOAT.S */
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_DOUBLE.S */
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_LONG.S */
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_FLOAT.S */
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2f                              @ r0<- op, r0-r3 changed
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_DOUBLE.S */
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2d                              @ r0<- op, r0-r3 changed
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_INT.S */
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_FLOAT.S */
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_INT.S */
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                              @ r0<- op, r0-r3 changed
3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unop.S" {"instr":"bl      f2i_doconv"}
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to an int in r0.
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2i_doconv:
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x4f000000             @ (float)maxint
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxint?
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xcf000000             @ (float)minint
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minint?
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                @ convert float to int
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_LONG.S */
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2d                              @ r0<- op, r0-r3 changed
3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_INT.S */
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                              @ r0<- op, r0-r3 changed
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl      d2i_doconv"}
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0.
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv:
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
40465162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0x80000000             @ maxint, as a double (low word)
40475162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, r2, asr #9              @  0xffc00000
4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
40495162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvn     r3, #0xbe000000             @ maxint, as a double (high word)
40505162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    sub     r3, r3, #0x00200000         @  0x41dfffff
40515162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxint?
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
40555162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvnne   r0, #0x80000000             @ return maxint (0x7fffffff)
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
40605162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc1000000             @ minint, as a double (high word)
40615162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, r3, #0x00e00000         @  0xc1e00000
40625162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minint, as a double (low word)
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minint?
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ return zero for NaN
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                @ convert double to int
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_LONG.S */
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2f                              @ r0<- op, r0-r3 changed
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_BYTE.S */
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #24                           @ optional op; may set condition codes
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_CHAR.S */
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_SHORT.S */
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT.S */
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT.S */
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT.S */
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT.S */
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT.S */
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT.S */
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT.S */
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT.S */
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT.S */
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT.S */
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT.S */
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG.S */
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG.S */
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG.S */
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        WX
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      x YZ
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  --------
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     ZW ZX
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  YW YX
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The low word of the result holds ZX, the high word holds
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * it doesn't fit in the low 64 bits.
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most ARM math operations, multiply instructions have
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * restrictions on using the same register more than once (Rd and Rm
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cannot be the same).
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_MUL_LONG_finish
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG.S */
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG.S */
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG.S */
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG.S */
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG.S */
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG.S */
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_finish
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG.S */
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_finish
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG.S */
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long vAA, vBB, vCC */
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_finish
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT.S */
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT.S */
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT.S */
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT.S */
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT.S */
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE.S */
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE.S */
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE.S */
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE.S */
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE.S */
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_2ADDR.S */
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5595a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT_2ADDR.S */
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5635a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_2ADDR.S */
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5676a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_2ADDR.S */
5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5716a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_2ADDR.S */
5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5757a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
5768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
5776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_2ADDR.S */
5777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5797a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_2ADDR.S */
5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5837a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_2ADDR.S */
5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5877a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_2ADDR.S */
5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5917a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_2ADDR.S */
5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5957a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_2ADDR.S */
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5997a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG_2ADDR.S */
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG_2ADDR.S */
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG_2ADDR.S */
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, "/2addr" version.
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_MUL_LONG for an explanation.
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We get a little tight on registers, so to avoid looking up &fp[A]
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again we stuff it into rINST.
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG_2ADDR.S */
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG_2ADDR.S */
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG_2ADDR.S */
6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG_2ADDR.S */
6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_2ADDR_finish
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long/2addr vA, vB */
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_2ADDR_finish
6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long/2addr vA, vB */
6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_2ADDR_finish
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6441a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6481a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6521a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6561a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6602a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT16.S */
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
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_RSUB_INT: /* 0xd1 */
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT.S */
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
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 0
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    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
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/* ------------------------------ */
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT16.S */
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT16.S */
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT16.S */
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT16.S */
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT16.S */
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT16.S */
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT8.S */
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT_LIT8.S */
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT8.S */
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT8.S */
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT8.S */
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT8.S */
7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT8.S */
7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT8.S */
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
7445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_LIT8.S */
7446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
7484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_LIT8.S */
7485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
7523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_LIT8.S */
7524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E3: /* 0xe3 */
7562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E3.S */
7563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E4: /* 0xe4 */
7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E4.S */
7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E5: /* 0xe5 */
7580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E5.S */
7581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E6: /* 0xe6 */
7589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E6.S */
7590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E7: /* 0xe7 */
7598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E7.S */
7599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
76075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
76085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE.S */
76095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Wide 32-bit instance field get.
76115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iget-wide vA, vB, field@CCCC */
76135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
76145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
76155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
76165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
76175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
76185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
76195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
76215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
76225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
76235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
76245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
76255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0
76265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish
76275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
76335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
76345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE.S */
76355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iput-wide vA, vB, field@CCCC */
76365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
76375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
76385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
76395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
76405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
76415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
76425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
76445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
76455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
76465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
76475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
76485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
76495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
76505387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
76565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
76575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE.S */
76585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SGET handler.
76605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sget-wide vAA, field@BBBB */
76625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
76635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
76645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
76655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
76665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
76685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_finish:
7669861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7670861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7671861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7672861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
7673861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7674861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7675861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7676861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
76775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7678861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
76795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
76805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
76865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
76875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE.S */
76885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SPUT handler.
76905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sput-wide vAA, field@BBBB */
7692861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]  @ r0<- DvmDex
76935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
7694861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
76955387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7696861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
76975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7698861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
76995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7700861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
77015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7702861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7703861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7704861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7705861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7706861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
7707861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7708861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7709861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7710861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
771596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
771696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: armv5te/OP_BREAKPOINT.S */
7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
77243a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
77253a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
77263a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /*
77273a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * Handle a throw-verification-error instruction.  This throws an
77283a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception for an error discovered during verification.  The
77293a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception is indicated by AA, with some detail provided by BBBB.
77303a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     */
77313a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /* op AA, ref@BBBB */
7732b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
77333a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    FETCH(r2, 1)                        @ r2<- BBBB
7734b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    EXPORT_PC()                         @ export the PC
77353a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     r1, rINST, lsr #8           @ r1<- AA
77363a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    bl      dvmThrowVerificationError   @ always throws
77373a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    b       common_exceptionThrown      @ handle exception
7738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
7743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_EXECUTE_INLINE.S */
7744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
7746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7747b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7748b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7750b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7751b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7752b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 1)                       @ r10<- BBBB
7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ can throw
7758b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [sp]                    @ push &glue->retval
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ pop stack
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ test boolean result of inline
7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ returned false, handle exception
7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7771b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7772b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7773b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
7774b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Execute a "native inline" instruction, using "/range" semantics.
7775b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Same idea as execute-inline, but we get the args differently.
7776b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7777b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7778b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7779b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7780b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7781b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7782b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7783b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
7784b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7785b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r10, 1)                       @ r10<- BBBB
7786b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7787b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    EXPORT_PC()                         @ can throw
7788b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7789b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
7790b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    str     r1, [sp]                    @ push &glue->retval
7791b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7792b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     sp, sp, #8                  @ pop stack
7793b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    cmp     r0, #0                      @ test boolean result of inline
7794b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    beq     common_exceptionThrown      @ returned false, handle exception
7795b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7796b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7797b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_EMPTY.S */
7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_F1.S */
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide-quick vA, vB, offset@CCCC */
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r0, [r3, r1]                @ r0<- obj.field (64 bits, aligned)
7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
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
7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide-quick vA, vB, offset@CCCC */
7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A(+)
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ check object for null
7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- field byte offset
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
8012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
8013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
8014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
8015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
8016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
8017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
8018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
8019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
8020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
8021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
8030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
8032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
8034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
8035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
8041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
8042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
8043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
8044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
8045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
8046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
8047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
8048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
8049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
8050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FC: /* 0xfc */
8056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FC.S */
8057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FD: /* 0xfd */
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FD.S */
8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FE: /* 0xfe */
8074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FE.S */
8075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FF.S */
8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionEnd
8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd:
8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Sister implementations
8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterStart
8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmSisterStart, %function
8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 4
8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart:
8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */
8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (String ref)
8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve:
8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBBBBBB (String ref)
8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */
8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the Class has not yet been resolved.
8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (Class ref)
8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve:
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- Class reference
8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */
8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_okay            @ no, success
8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ A cast has failed.  We need to throw a ClassCastException with the
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ class of the object that failed to be cast.
8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ about to throw
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]  @ r3<- obj->clazz
8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .LstrClassCastExceptionPtr
8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r3, #offClassObject_descriptor] @ r1<- obj->clazz->descriptor
8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowExceptionWithClassMessage
8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds BBBB
8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve:
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- BBBB
8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastExceptionPtr:
8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrClassCastException
8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */
8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_INSTANCE_OF_store
8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r0 holds boolean result
8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r9 holds A
8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store:
8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test succeeded, save and bail.
8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial:
8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #1                      @ indicate success
8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r3 holds BBBB
8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve:
8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r3                      @ r1<- BBBB
8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 32                          @ minimize cache lines
8271b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden.LOP_NEW_INSTANCE_finish: @ r0=new object
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class initialization required.
8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class object
8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0                      @ save r0
8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInitClass                @ initialize class
8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ check boolean result
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ restore r0
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ failed, deal with init exception
8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds BBBB
8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationErrorPtr:
8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInstantiationError
8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */
8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds class ref CCCC
8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve:
8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ r9<- length (save)
8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- CCCC
8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ r1<- length (restore)
8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_NEW_ARRAY_finish
8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation.
8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class
8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish:
8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ vA<- r0
8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #'I'                    @ array of ints?
8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'L'                    @ array of objects?
8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'['                    @ array of arrays?
8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
8372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
8417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)                 @ define in one or the other, not both
8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #'I'                    @ array of ints?
8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'L'                    @ array of objects?
8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'['                    @ array of arrays?
8449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
8490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
8496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)                 @ define in one or the other, not both
8502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
8510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_gt_or_nan:
8515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_FLOAT_finish
8521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_FLOAT_finish
8523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_continue
8542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_continue:
8545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPL_FLOAT_nan               @ no, must be NaN
8552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_finish:
8556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_nan:
8567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_finish
8569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
8574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_gt_or_nan:
8579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_FLOAT_finish
8585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_FLOAT_finish
8587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_continue
8606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_continue:
8609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPG_FLOAT_nan               @ no, must be NaN
8616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_finish:
8620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_nan:
8631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_finish
8633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
8638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_gt_or_nan:
8643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_DOUBLE_finish
8649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_DOUBLE_finish
8651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
8654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_gt_or_nan:
8659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_DOUBLE_finish
8665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_DOUBLE_finish
8667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */
8670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_less:
8672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                      @ r1<- -1
8673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Want to cond code the next mov so we can avoid branch, but don't see it;
8674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ instead, we just replicate the tail end.
8675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)                    @ vAA<- r1
8677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_greater:
8681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ r1<- 1
8682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish:
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
8691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */
8692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish:
8694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
8697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
8699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */
8703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish:
8705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
8707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */
8713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = vBB (arrayObj)
8716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = vAA (obj)
8717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = offset into array (vBB + vCC * width)
8718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_finish:
8720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ storing null reference?
8721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
8722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offObject_clazz]  @ r1<- arrayObj->clazz
8724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCanPutArrayElement       @ test object type vs. array type
8725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ okay?
8726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errArrayStore        @ no
8727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
8728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
8731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */
8735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish:
8742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */
8756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish:
8763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8766861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
8767861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
8768861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
8769861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
8771861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8772861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8774861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */
8782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish:
8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */
8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish:
8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */
8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish:
8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */
8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish:
8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */
8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish:
8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */
8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish:
8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
8920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
8923861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8924861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
8925861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- target address
8926861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
8927861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8928861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
8929861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8930861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */
8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish:
8941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
8962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */
8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish:
8983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
8984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */
8997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
9000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
9001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
9002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish:
9004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
9005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
9006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
9008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
9009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
9010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
9011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */
9018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
9021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
9022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
9023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish:
9025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
9026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
9027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
9029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
9030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
9031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
9032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */
9039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve:
9045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_finish          @ yes, finish
9051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */
9055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9059861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9060861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
9061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_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_WIDE_finish          @ yes, finish
9069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */
9073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve:
9079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_OBJECT_finish          @ yes, finish
9085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
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_BOOLEAN_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_BOOLEAN_finish          @ yes, finish
9101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */
9105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve:
9111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_BYTE_finish          @ yes, finish
9117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */
9121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve:
9127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_CHAR_finish          @ yes, finish
9133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */
9137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve:
9143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_SHORT_finish          @ yes, finish
9149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */
9153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve:
9159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_finish          @ yes, finish
9165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */
9169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: &fp[AA]
9174861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9175861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
9176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve:
9178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9183861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
9184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_WIDE_finish          @ yes, finish
9185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
9189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_resolve:
9195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_OBJECT_finish          @ yes, finish
9201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
9205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
9211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BOOLEAN_finish          @ yes, finish
9217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */
9221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve:
9227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BYTE_finish          @ yes, finish
9233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */
9237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve:
9243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_CHAR_finish          @ yes, finish
9249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */
9253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve:
9259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_SHORT_finish          @ yes, finish
9265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
9269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
9276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r10)                   @ r1<- "this" ptr
9277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is "this" null?
9279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
9280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
9281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
9284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
9287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
9292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue:
9294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
9295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
9298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
9300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
9303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
9305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
9306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
9310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
9317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
9322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
9329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
9336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
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
9357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
9358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
9363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
9365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
9366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
9369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
9371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
9374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
9376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
9377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
9381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
9388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
9393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
9400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
9407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
9411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to a long in r0/r1.
9413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2l_doconv:
9419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
9420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x5f000000             @ (float)maxlong
9421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
9422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxlong?
9423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffff)
9425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xdf000000             @ (float)minlong
9430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minlong?
9431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (80000000)
9433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
9438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
9439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}
9442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2lz                @ convert float to long
9445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
9446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
9449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to a long in r0/r1.
9451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2l_doconv:
9457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
94585162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0x43000000             @ maxlong, as a double (high word)
94595162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0x43e00000
94605162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ maxlong, as a double (low word)
9461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
94625162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
9463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
9464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxlong?
9465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
9467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
94725162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc3000000             @ minlong, as a double (high word)
94735162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0xc3e00000
94745162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minlong, as a double (low word)
9475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minlong?
9476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (8000000000000000)
9478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
9484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
9485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
9486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f
9489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2lz                @ convert double to long
9493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
9495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
9496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
9497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */
9500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_finish:
9502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
9504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */
9508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish:
9510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
9511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */
9517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish:
9519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
9520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */
9526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish:
9528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
9529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
9535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
9537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
9543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
9545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
9551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
9553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
95585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IGET_WIDE_VOLATILE */
95595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
95615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
95625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
95635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
95645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
95655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IGET_WIDE_VOLATILE_finish:
95665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
95675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
95685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
9569861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
9570861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
9571861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
9572861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
95735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
9574861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
9575861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
95765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9577861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
95785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
95795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
95805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
95815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
95825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IPUT_WIDE_VOLATILE */
95855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
95875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
95885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
95895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
95905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
95915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IPUT_WIDE_VOLATILE_finish:
95925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
95935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
95945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    and     r2, r2, #15                 @ r2<- A
95955387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
95965387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
95975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
95985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
95995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
9600861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
9601861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
9602861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- target address
9603861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
9604861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
9605861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
9606861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
9607861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
96085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SGET_WIDE_VOLATILE */
96115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
96135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
96145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
9615861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9616861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
96175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
96185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_resolve:
96195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
96205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
96215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
96225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
96235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
96245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SGET_WIDE_VOLATILE_finish          @ yes, finish
96255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
96265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SPUT_WIDE_VOLATILE */
96295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96305387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
96315387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
96325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
96335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9: &fp[AA]
9634861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9635861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
96365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
96375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SPUT_WIDE_VOLATILE_resolve:
96385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
96395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
96405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
96415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
96425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
9643861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
96445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SPUT_WIDE_VOLATILE_finish          @ yes, finish
96455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
96465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
9648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
9649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Extract args, call function.
9652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = #of args (0-4)
9653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = call index
9654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
9656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Other ideas:
9657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Use a jump table from the main piece to jump directly into the
9658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   AND/LDR pairs.  Costs a data load, saves a branch.
9659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Have five separate pieces that do the loading, so we can work the
9660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   interleave a little better.  Increases code size.
9661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
9663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #4                  @ r0<- 4-r0
9664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r9, 2)                        @ r9<- FEDC
9665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
9667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r9, #0xf000             @ isolate F
9668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
9669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r9, #0x0f00             @ isolate E
9670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
9671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r9, #0x00f0             @ isolate D
9672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
9673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r9, #0x000f             @ isolate C
9674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
9675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:
9676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, .LOP_EXECUTE_INLINE_table       @ table of InlineOperation
9677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (not reached)
9679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_table:
9681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   gDvmInlineOpsTable
9682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9684b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* continuation for OP_EXECUTE_INLINE_RANGE */
9685b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9686b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
9687b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Extract args, call function.
9688b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r0 = #of args (0-4)
9689b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r10 = call index
9690b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9691b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
9692b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_continue:
9693b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    rsb     r0, r0, #4                  @ r0<- 4-r0
9694b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r9, 2)                        @ r9<- CCCC
9695b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9696b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      common_abort                @ (skipped due to ARM prefetch)
9697b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden4:  add     ip, r9, #3                  @ base+3
9698b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r3, ip)                    @ r3<- vBase[3]
9699b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden3:  add     ip, r9, #2                  @ base+2
9700b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r2, ip)                    @ r2<- vBase[2]
9701b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden2:  add     ip, r9, #1                  @ base+1
9702b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r1, ip)                    @ r1<- vBase[1]
9703b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden1:  add     ip, r9, #0                  @ (nop)
9704b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r0, ip)                    @ r0<- vBase[0]
9705b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden0:
9706b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
9707b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9708b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    @ (not reached)
9709b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9710b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_table:
9711b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    .word   gDvmInlineOpsTable
9712b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9713b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
9715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterEnd
9716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd:
9717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/footer.S */
9719ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Common subroutines and data
9723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9727ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
9729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
9730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9731ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
973297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
973397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpPunt
973497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpPunt:
9735d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
973697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
9737d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9738d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9739d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
974097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
974197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpSingleStep
974297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpSingleStep:
9743d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    lr,[rGLUE,#offGlue_jitResumeNPC]
9744d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r1,[rGLUE,#offGlue_jitResumeDPC]
974597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
9746d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
974797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
974840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
974940094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
9750d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
975140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC                       @ pass our target PC
975240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
9753d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9754d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9755d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
975640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng
975740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
975840094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
9759d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
97609a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
976197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
9762d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9763d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9764d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
976597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
976640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpBackwardBranch
976740094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpBackwardBranch:
9768d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
97699a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
977097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
9771d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9772d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9773d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
977497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
977597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNormal
977697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNormal:
9777d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
97789a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
977997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
9780d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9781d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9782d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
978397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
978497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNoChain
978597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNoChain:
9786d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
978797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r0,rPC                       @ pass our target PC
978897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
9789d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9790d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9791d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
979297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
9793ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9794ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter when the compiler is
9795ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * having issues translating/executing a Dalvik instruction. We have to skip
9796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the code cache lookup otherwise it is possible to indefinitely bouce
9797ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * between the interpreter and the code cache if the instruction that fails
9798ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to be compiled happens to be at a trace start.
9799ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9800ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpPunt
9801ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpPunt:
98027a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
9803ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC, r0
9804978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
9805ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,lr
9806ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpPunt;
9807ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9808ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
98097a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov    r0, #0
98107a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9811ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9812ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9813ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9814ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9815ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9816ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9817ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return to the interpreter to handle a single instruction.
9818ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * On entry:
9819ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r0 <= PC
9820ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r1 <= PC of resume instruction
9821ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    lr <= resume point in translation
9822ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9823ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpSingleStep
9824ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpSingleStep:
9825d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    lr,[rGLUE,#offGlue_jitResumeNPC]
9826d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r1,[rGLUE,#offGlue_jitResumeDPC]
9827ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#kInterpEntryInstr
9828ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ enum is 4 byte in aapcs-EABI
9829ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r1, [rGLUE, #offGlue_entryPoint]
9830ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC,r0
9831ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
98327a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng
9833ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9834ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r2,#kJitSingleStep     @ Ask for single step and then revert
9835ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r2,[rGLUE,#offGlue_jitState]
9836ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#1                  @ set changeInterp to bail to debug interp
9837ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b      common_gotoBail
9838ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
983940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
984040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * Return from the translation cache and immediately request
984140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * a translation for the exit target.  Commonly used for callees.
984240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
984340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
984440094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
9845978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
984640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmBumpNoChain
984740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng#endif
984840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
984940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC
985040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
985140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
985240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r1, rPC                  @ arg1 of translation may need this
985340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
985440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    cmp    r0,#0
985540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bxne   r0                       @ continue native execution if so
985640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    b      2f
9857ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9858ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9859ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache and immediately request
9860ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a translation for the exit target.  Commonly used following
9861ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * invokes.
9862ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
986340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
986440094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
98659a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
98667a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
98679a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
9868ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
98697a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    bl     dvmJitGetCodeAddr       @ Is there a translation?
98707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
9871ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
9872ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq    2f
9873ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
9874ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
98759a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
98769a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
987746cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
987846cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
987946cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
9880ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9881ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* No translation, so request one if profiling isn't disabled*/
9882ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng2:
98831da12167d913efde56ec3b40491524b051679f2cAndy McFadden    adrl   rIBASE, dvmAsmInstructionStart
9884ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9885ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9886ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0, #0
988740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
9888ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne    common_selectTrace
9889ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9890ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9891ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9892ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9893ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter.
9894ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The return was done with a BLX from thumb mode, and
9895ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the following 32-bit word contains the target rPC value.
9896ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Note that lr (r14) will have its low-order bit set to denote
9897ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * its thumb-mode origin.
9898ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
9899ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We'll need to stash our lr origin away, recover the new
9900ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * target and then check to see if there is a translation available
9901ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for our new target.  If so, we do a translation chain and
9902ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * go back to native execution.  Otherwise, it's back to the
9903ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * interpreter (after treating this entry as a potential
9904ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace start).
9905ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9906ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNormal
9907ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNormal:
99089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
99097a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
99109a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
9911978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
9912ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNormal
9913ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9914ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
9915ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
99167a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
9917ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
991846cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    beq    toInterpreter            @ go if not, otherwise do chain
9919ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
9920ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
99219a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
99229a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
992346cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
992446cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
992546cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
9926ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9927ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9928ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter to do method invocation.
9929ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Check if translation exists for the callee, but don't chain to it.
9930ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9931ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNoChain
9932ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNoChain:
9933978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
9934ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNoChain
9935ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
99367a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
9937ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
9938ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
99397a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
99409a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
99419a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
9942ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
9943ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne   r0                       @ continue native execution if so
994497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
9945ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9946ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9947ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * No translation, restore interpreter regs and start interpreting.
9948ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * rGLUE & rFP were preserved in the translated code, and rPC has
9949ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * already been restored by the time we get here.  We'll need to set
9950ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * up rIBASE & rINST, and load the address of the JitTable into r0.
9951ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
995246cd5b63c29d3284a9ff3e0d0711fb136f409313Bill BuzbeetoInterpreter:
9953ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
9954ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9955ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9956ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9957ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ NOTE: intended fallthrough
9958ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9959ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Common code to update potential trace start counter, and initiate
9960ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a trace-build if appropriate.  On entry, rPC should point to the
9961ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * next instruction to execute, and rINST should be already loaded with
9962ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the next opcode word, and r0 holds a pointer to the jit profile
9963ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * table (pJitProfTable).
9964ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9965ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_testUpdateProfile:
9966ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
9967ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9968ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFEQ(ip)       @ if not profiling, fallthrough otherwise */
9969ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9970ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_updateProfile:
9971ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
99727b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
99737b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
9974ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9975ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    r1,r1,#1           @ decrement counter
99767b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
9977ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
9978ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9979ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9980ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Here, we switch to the debug interpreter to request
9981ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace selection.  First, though, check to see if there
9982ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * is already a native translation in place (and, if so,
9983ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * jump to it now).
9984ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9985d726991ba52466cde88e37aba4de2395b62477faBill Buzbee    GET_JIT_THRESHOLD(r1)
99867a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self
99877b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
9988ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
9989ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0,rPC
9990ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
99917a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
99927a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r1, rPC                     @ arg1 of translation may need this
99937a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
9994ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
999597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
9996ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    r0                          @ jump to the translation
999740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     r2,#kJitTSelectRequest      @ ask for trace selection
999840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    @ fall-through to common_selectTrace
999997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
1000040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
100019a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    beq     common_selectTrace
100029a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
100039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * At this point, we have a target translation.  However, if
100049a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * that translation is actually the interpret-only pseudo-translation
100059a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * we want to treat it the same as no translation.
100069a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
10007d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov     r10, r0                     @ save target
100089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bl      dvmCompilerGetInterpretTemplate
10009d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    cmp     r0, r10                     @ special case?
10010d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bne     jitSVShadowRunStart         @ set up self verification shadow space
100119a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GET_INST_OPCODE(ip)
100129a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GOTO_OPCODE(ip)
100139a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /* no return */
1001497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
100159a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
1001640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
1001740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * On entry:
1001840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
1001940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
10020ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_selectTrace:
10021ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r2,[rGLUE,#offGlue_jitState]
100229c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    mov     r2,#kInterpEntryInstr       @ normal entry reason
100239c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    str     r2,[rGLUE,#offGlue_entryPoint]
10024ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1,#1                       @ set changeInterp
10025ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b       common_gotoBail
10026ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1002797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
1002897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
1002997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Save PC and registers to shadow memory for self verification mode
1003097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping to native translation.
10031d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * On entry:
10032d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng *    rPC, rFP, rGLUE: the values that they should contain
10033d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng *    r10: the address of the target translation.
1003497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
10035d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunStart:
1003697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r0,rPC                      @ r0<- program counter
1003797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r1,rFP                      @ r1<- frame pointer
1003897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r2,rGLUE                    @ r2<- InterpState pointer
100399a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r3,r10                      @ r3<- target translation
1004097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl      dvmSelfVerificationSaveState @ save registers to shadow space
10041ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
10042ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    add     rGLUE,r0,#offShadowSpace_interpState @ rGLUE<- rGLUE in shadow space
10043ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    bx      r10                         @ jump to the translation
1004497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1004597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
1004697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Restore PC, registers, and interpState to original values
1004797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping back to the interpreter.
1004897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
10049d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunEnd:
1005097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,rFP                        @ pass ending fp
1005197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
10052ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rPC,[r0,#offShadowSpace_startPC] @ restore PC
10053ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rFP,[r0,#offShadowSpace_fp]   @ restore FP
10054ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rGLUE,[r0,#offShadowSpace_glue] @ restore InterpState
10055ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
1005697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    cmp    r1,#0                         @ check for punt condition
1005797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    beq    1f
1005897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kJitSelfVerification      @ ask for self verification
1005997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    str    r2,[rGLUE,#offGlue_jitState]
1006030f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    mov    r2,#kInterpEntryInstr         @ normal entry reason
1006130f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    str    r2,[rGLUE,#offGlue_entryPoint]
1006297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,#1                         @ set changeInterp
1006397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      common_gotoBail
1006497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1006597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao1:                                       @ exit to interpreter without check
1006697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    EXPORT_PC()
1006797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    adrl   rIBASE, dvmAsmInstructionStart
1006897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    FETCH_INST()
1006997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GET_INST_OPCODE(ip)
1007097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GOTO_OPCODE(ip)
1007197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
1007297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
10073ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10074ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backward branch is taken.
10077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10078c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * TODO: we could avoid a branch by just setting r0 and falling through
10079c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * into the common_periodicChecks code, and having a test on r0 at the
10080c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * end determine if we should return to the caller or update & branch to
10081c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the next instr.
10082c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *
10083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is PC adjustment *in bytes*
10085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
10087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryInstr
10088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10089ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10090ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10091ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
10092ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10093ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10094ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
10095ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
10096ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
10098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10100ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Need to see if the thread needs to be suspended or debugger/profiler
10105c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * activity has begun.  If so, we suspend the thread or side-exit to
10106c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * the debug interpreter as appropriate.
10107c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *
10108c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * The common case is no activity on any of these, so we want to figure
10109c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * that out quickly.  If something is up, we can then sort out what.
10110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10111c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * We want to be fast if the VM was built without debugger or profiler
10112c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * support, but we also need to recognize that the system is usually
10113c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden * shipped with both of these enabled.
10114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: reduce this so we're just checking a single location.
10116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10118c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden *  r0 is reentry type, e.g. kInterpEntryInstr (for debugger/profiling)
10119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is trampoline PC adjustment *in bytes*
10120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
10122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_pSelfSuspendCount] @ r3<- &suspendCount
10123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
10125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_pDebuggerActive]   @ r1<- &debuggerActive
10126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER)
10128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_pActiveProfilers]  @ r2<- &activeProfilers
10129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10131c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     ip, [r3]                    @ ip<- suspendCount (int)
10132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10133c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
10134c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     r1, #0                      @ debugger enabled?
10135c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldrneb  r1, [r1]                    @ yes, r1<- debuggerActive (boolean)
10136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
10137c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrne   ip, ip, r1                  @ ip<- suspendCount | debuggerActive
10138c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrs    ip, ip, r2                  @ ip<- suspend|debugger|profiler; set Z
10139c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#elif defined(WITH_DEBUGGER)
10140c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     r1, #0                      @ debugger enabled?
10141c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldrneb  r1, [r1]                    @ yes, r1<- debuggerActive (boolean)
10142c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrsne  ip, ip, r1                  @ yes, ip<- suspend | debugger; set Z
10143c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    @ (if not enabled, Z was set by test for r1==0, which is what we want)
10144c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#elif defined (WITH_PROFILER)
10145c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
10146c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrs    ip, ip, r2                  @ ip<- suspendCount | activeProfilers
10147c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#else
10148c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     ip, #0                      @ not ORing anything in; set Z
10149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10151c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    bxeq    lr                          @ all zero, return
10152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10153c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    /*
10154c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * One or more interesting events have happened.  Figure out what.
10155c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     *
10156c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * If debugging or profiling are compiled in, we need to disambiguate.
10157c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     *
10158c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * r0 still holds the reentry type.
10159c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     */
10160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
10161c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     ip, [r3]                    @ ip<- suspendCount (int)
10162c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     ip, #0                      @ want suspend?
10163c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    beq     1f                          @ no, must be debugger/profiler
10164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10166c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    stmfd   sp!, {r0, lr}               @ preserve r0 and lr
10167964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10168964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    /*
10169964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * Refresh the Jit's cached copy of profile table pointer.  This pointer
10170964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * doubles as the Jit's on/off switch.
10171964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     */
10172d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ r3<-&gDvmJit.pJitProfTable
10173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
10174d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r3, [r3] @ r3 <- pJitProfTable
1017599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         @ need for precise GC
10176964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh Jit's on/off switch
10177964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#else
10178964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
10179964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    EXPORT_PC()                         @ need for precise GC
10180964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10181c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    bl      dvmCheckSuspendPending      @ do full check, suspend if necessary
10182c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldmfd   sp!, {r0, lr}               @ restore r0 and lr
10183c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10184c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
10185c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10186c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    /*
10187c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * Reload the debugger/profiler enable flags.  We're checking to see
10188c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * if either of these got set while we were suspended.
10189c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     *
10190c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * We can't really avoid the #ifdefs here, because the fields don't
10191c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     * exist when the feature is disabled.
10192c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden     */
10193c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_DEBUGGER)
10194c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     r1, [rGLUE, #offGlue_pDebuggerActive]   @ r1<- &debuggerActive
10195c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    cmp     r1, #0                      @ debugger enabled?
10196c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldrneb  r1, [r1]                    @ yes, r1<- debuggerActive (boolean)
10197c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#else
10198c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    mov     r1, #0
10199c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#endif
10200c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#if defined(WITH_PROFILER)
10201c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     r2, [rGLUE, #offGlue_pActiveProfilers]  @ r2<- &activeProfilers
10202c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
10203c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#else
10204c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    mov     r2, #0
10205c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#endif
10206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10207c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    orrs    r1, r1, r2
10208c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    beq     2f
10209c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10210c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden1:  @ debugger/profiler enabled, bail out; glue->entryPoint was set above
10211c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    str     r0, [rGLUE, #offGlue_entryPoint]    @ store r0, need for debug/prof
10212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, rPC, r9                @ update rPC
10213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ "want switch" = true
10214c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    b       common_gotoBail             @ side exit
10215c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10216c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden#endif /*WITH_DEBUGGER || WITH_PROFILER*/
10217c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden
10218c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden2:
10219c95e0fbce4f77b2b08eb48205e405793de0d4248Andy McFadden    bx      lr                          @ nothing to do, return
10220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The equivalent of "goto bail", this calls through the "bail handler".
10224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * State registers will be saved to the "glue" area before bailing.
10226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1 is "bool changeInterp", indicating if we want to switch to the
10229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     other interpreter or just bail all the way out
10230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
10232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
10233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ r0<- glue ptr
10234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       dvmMterpStdBail             @ call(glue, changeInterp)
10235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r1, r1, #1                  @ using (boolean+1)
10237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r0, rGLUE, #offGlue_jmpBuf  @ r0<- &glue->jmpBuf
10238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      _longjmp                    @ does not return
10239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_abort
10240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation with range.
10244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
10247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodRange:
10249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewRange:
10250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
10251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
10252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
10253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LinvokeArgsDone            @ if no args, skip the rest
10254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- CCCC
10255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
10257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (very few methods have > 10 args; could unroll for common cases)
10258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
10259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
10260642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
10261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r1, [r3], #4                @ val = *fp++
10262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r2, r2, #1                  @ count--
10263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r10], #4               @ *outs++ = val
10264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1b                          @ ...while count != 0
10265642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r3, [r0, #offMethod_outsSize]   @ r3<- methodToCall->outsSize
10266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LinvokeArgsDone
10267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation without range.
10270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
10273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodNoRange:
10275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewNoRange:
10276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
10277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
10278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
10279642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
10280642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
10281642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
10282642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    beq     .LinvokeArgsDone
10283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10284642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    @ r0=methodToCall, r1=GFED, r3=outSize, r2=count, r9=regSize, r10=outs
10285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNonRange:
10286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r2, r2, #5                  @ r2<- 5-r2
10287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
10288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
10289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project5:  and     ip, rINST, #0x0f00          @ isolate A
10290642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
10291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10292642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vA
10293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r1, #0xf000             @ isolate G
10294642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
10295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10296642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vG
10297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r1, #0x0f00             @ isolate F
10298642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
10299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10300642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vF
10301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r1, #0x00f0             @ isolate E
10302642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
10303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10304642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vE
10305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r1, #0x000f             @ isolate D
10306642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
10307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10308642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vD
10309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  @ fall through to .LinvokeArgsDone
10310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10311642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng.LinvokeArgsDone: @ r0=methodToCall, r3=outSize, r9=regSize
10312642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
10313642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
10314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ find space for the new stack frame, check for overflow
10315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
10316642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
10317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
10318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@    bl      common_dumpRegs
10319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
10320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
10321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, r9                      @ bottom < interpStackEnd?
10322642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
103237a44e4ee0782d24b4c6090be1f0a3c66f971f2c1Andy McFadden    blo     .LstackOverflow             @ yes, this frame will overflow stack
10324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ set up newSaveArea
10326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB
10327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
10328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [r10, #offStackSaveArea_prevSave]
10329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r10, #offStackSaveArea_prevFrame]
10331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rPC, [r10, #offStackSaveArea_savedPc]
10332ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10333ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, #0
10334ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r9, [r10, #offStackSaveArea_returnAddr]
10335ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r10, #offStackSaveArea_method]
10337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    tst     r3, #ACC_NATIVE
10338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LinvokeNative
10339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
10342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
10343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP
10344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
10346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
10347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
10348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1
10349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
10350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
10351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
10352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
10353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
10354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10355642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
10356642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
10357642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r2                         @ publish new rPC
10358642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
10359642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
10360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Update "glue" values for the new method
10361642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    @ r0=methodToCall, r1=newFp, r2=self, r3=newMethodClass, r9=newINST
10362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
10363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
10364ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10365ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r1                         @ fp = newFp
10367642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
10368642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rINST, r9                       @ publish new rINST
10369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
10370ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10371ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                         @ jump to next instruction
10373ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10374ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
10375ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
10376ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rINST, r9                       @ publish new rINST
10377ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
10378ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                         @ jump to next instruction
10379ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNative:
10382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Prep for the native call
10383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=newFp, r10=newSaveArea
10384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
10385d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
10386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
10387d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
10388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r3                      @ r9<- glue->self (preserve)
10389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ r2<- methodToCall
10391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                      @ r0<- newFp (points to args)
10392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
10393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
10395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
10396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .Lskip
10397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_mterp, %function
10398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_mterp:
10399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
10400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
10401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
10402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lskip:
10403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @mov     lr, pc                      @ set return addr
10406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
10407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC_LR "[r2, #offMethod_nativeFunc]"
10408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10409964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10410964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ Refresh Jit's on/off status
10411964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10412964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
10413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ native return; r9=self, r10=newSaveArea
10414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ equivalent to dvmPopJniLocals
10415d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
10416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offThread_exception] @ check for exception
10417964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10418964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3]                    @ r3 <- gDvmJit.pProfTable
10419964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
10421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null?
10422d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
10423964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10424964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh cached on/off switch
10425964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ no, handle exception
10427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104326ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    @ r0=methodToCall
104336ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    mov     r1, r0                      @ r1<- methodToCall
10434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- self
10435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmHandleStackOverflow
10436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
10438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
10439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Common code for method invocation, calling through "glue code".
10444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TODO: now that we have range and non-range invoke handlers, this
10446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       needs to be split into two.  Maybe just create entry points
10447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       that set r9 and jump here?
10448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
10450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 is "Method* methodToCall", the method we're trying to call
10451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 is "bool methodCallRange", indicating if this is a /range variant
10452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
10454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeOld:
10455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #8                  @ space for args + pad
10456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
10457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ A2<- methodToCall
10458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ A0<- glue
10459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
10460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ A1<- methodCallRange
10461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ A3<- AA
10462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #0]                @ A4<- ip
10463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
10464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ remove arg area
10465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall  @ continue to next instruction
10466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction.
10472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
10474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
10476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnNew:
10477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryReturn
10478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
10479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
10482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
10483642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
10484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
10485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        @ r2<- method we're returning to
10486642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
10487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is this a break frame?
10488642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
10489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
10490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_gotoBail             @ break frame, bail out completely
10491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10492642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
10493642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
10494642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
10495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r3, #offThread_curFrame]  @ self->curFrame = fp
10496ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
104977a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
10498ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10499ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rPC, r9                     @ publish new rPC
10500ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [rGLUE, #offGlue_methodClassDex]
105017a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r10, [r3, #offThread_inJitCodeCache]  @ may return to JIT'ed land
105027a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    cmp     r10, #0                      @ caller is compiled code
105037a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    blxne   r10
10504ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10505ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10506ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10507ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
10508ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10510642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r9                     @ publish new rPC
10511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_methodClassDex]
10512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return handling, calls through "glue code".
10517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
10519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnOld:
10520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
10521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
10522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_returnFromMethod
10523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
10524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
10529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
10531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
10532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
10533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
10535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10536ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     .global dvmMterpCommonExceptionThrown
10537ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmMterpCommonExceptionThrown:
10538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
10539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionNew:
10540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryThrow
10541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
10542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r10, [rGLUE, #offGlue_self] @ r10<- glue->self
10545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r10, #offThread_exception] @ r9<- self->exception
10546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
10549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- NULL
10550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r10, #offThread_exception] @ self->exception = NULL
10551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up args and a local for "&fp" */
10553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
10554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [sp, #-4]!             @ *--sp = fp
10555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     ip, sp                      @ ip<- &fp
10556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- false
10557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #-4]!              @ *--sp = &fp
10558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_method] @ r1<- glue->method
10559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
10560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
10561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r9                      @ r2<- exception
10562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1                 @ r1<- pc - method->insns
10563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #1              @ r1<- offset in code units
10564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call, r0 gets catchRelPc (a code-unit offset) */
10566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
10567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix earlier stack overflow if necessary; may trash rFP */
10569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
10570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
10571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ no, skip ahead
10572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r0                     @ save relPc result in rFP
10573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
105744fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    mov     r1, r9                      @ r1<- exception
10575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCleanupStackOverflow     @ call(self)
10576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP                     @ restore result
10577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
10578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* update frame pointer and check result from dvmFindCatchBlock */
10580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
10581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is catchRelPc < 0?
10582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ restore stack
10583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     .LnotCaughtLocally
10584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* adjust locals to match self->curFrame and updated PC */
10586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
10587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
10588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_method]    @ glue->method = new method
10589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
10590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
10591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
10592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
10593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r2, [rGLUE, #offGlue_methodClassDex] @ glue->pDvmDex = meth...
10594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* release the tracked alloc on the exception */
10596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
10599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* restore the exception if the handler wants it */
10601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
10602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
10604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    streq   r9, [r10, #offThread_exception] @ yes, restore the exception
10605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LnotCaughtLocally: @ r9=exception, r10=self
10608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix stack overflow if necessary */
10609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
10610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
10611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, r10                     @ if yes: r0<- self
106124fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    movne   r1, r9                      @ if yes: r1<- exception
10613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blne    dvmCleanupStackOverflow     @ if yes: call(self)
10614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ may want to show "not caught locally" debug messages here
10616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if DVM_SHOW_EXCEPTION >= 2
10617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call __android_log_print(prio, tag, format, ...) */
10618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* "Exception %s from %s:%d not caught locally" */
10619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmLineNumFromPC(method, pc - method->insns)
10620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
10621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_insns]
10622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1
10623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    asr     r1, r1, #1
10624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLineNumFromPC
10625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
10626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmGetMethodSourceFile(method)
10627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
10628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmGetMethodSourceFile
10629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
10630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ exception->clazz->descriptor
10631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]
10632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_descriptor]
10633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @
10634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, strExceptionNotCaughtLocally
10635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strLogTag
10636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #3                      @ LOG_DEBUG
10637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __android_log_print
10638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offThread_exception] @ restore exception
10640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
10643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
10644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_gotoBail             @ bail out
10645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exception handling, calls through "glue code".
10649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
10651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionOld:
10652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
10653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
10654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_exceptionThrown
10655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
10656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated
10661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values and start executing at the next instruction.
10662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_resumeAfterGlueCall:
10664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FP_FROM_GLUE()              @ pull rPC and rFP out of glue
10665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
10666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array index.
10671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
10673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayIndexException
10675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
10681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
10683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayStoreException
10685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero.
10691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
10693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArithmeticException
10695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strDivideByZero
10696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
10701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
10703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNegativeArraySizeException
10705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation of a non-existent method.
10711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
10713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNoSuchMethodError
10715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We encountered a null object when we weren't expecting one.  We
10721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * export the PC, throw a NullPointerException, and goto the exception
10722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * processing code.
10723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
10725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNullPointerException
10727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For debugging, cause an immediate fault.  The source address will
10733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be in lr (use a bl instruction to jump here).
10734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
10736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, .LdeadFood
10737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LdeadFood:
10738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xdeadf00d
10739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out a "we were here", preserving all registers.  (The attempt
10742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to save ip won't work, but we need to save an even number of
10743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers for EABI 64-bit stack alignment.)
10744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .macro  SQUEAK num
10746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_squeak\num:
10747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
10749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #\num
10750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endm
10754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  0
10756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  1
10757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  2
10758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  3
10759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  4
10760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  5
10761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out the number in r0, preserving registers.
10764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNum:
10766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
10768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
10769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a newline, preserving registers.
10775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNewline:
10777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNewline
10779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
10785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printHex:
10787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
10789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintHex
10790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 64-bit quantity in r0-r1, preserving registers.
10796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printLong:
10798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r1
10800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0
10801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintLong
10802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print full method info.  Pass the Method* in r0.  Preserves regs.
10808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printMethod:
10810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpPrintMethod
10812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Call a C helper function that dumps regs and possibly some
10817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional info.  Requires the C function to be compiled in.
10818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
10820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_dumpRegs:
10821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpDumpArmRegs
10823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10827d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#if 0
10828d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden/*
10829d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Experiment on VFP mode.
10830d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10831d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * uint32_t setFPSCR(uint32_t val, uint32_t mask)
10832d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10833d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Updates the bits specified by "mask", setting them to the values in "val".
10834d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden */
10835d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddensetFPSCR:
10836d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r0, r0, r1                  @ make sure no stray bits are set
10837d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmrx    r2, fpscr                   @ get VFP reg
10838d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mvn     r1, r1                      @ bit-invert mask
10839d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r2, r2, r1                  @ clear masked bits
10840d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    orr     r2, r2, r0                  @ set specified bits
10841d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmxr    fpscr, r2                   @ set VFP reg
10842d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, r2                      @ return new value
10843d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bx      lr
10844d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10845d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .align  2
10846d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .global dvmConfigureFP
10847d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .type   dvmConfigureFP, %function
10848d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddendvmConfigureFP:
10849d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    stmfd   sp!, {ip, lr}
10850d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x03000000 sets DN/FZ */
10851d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x00009f00 clears the six exception enable flags */
10852d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      common_squeak0
10853d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, #0x03000000             @ r0<- 0x03000000
10854d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
10855d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      setFPSCR
10856d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    ldmfd   sp!, {ip, pc}
10857d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#endif
10858d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references, must be close to the code that uses them.
10862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
10864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArithmeticException:
10865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArithmeticException
10866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayIndexException:
10867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayIndexException
10868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayStoreException:
10869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayStoreException
10870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrDivideByZero:
10871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrDivideByZero
10872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNegativeArraySizeException:
10873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNegativeArraySizeException
10874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNoSuchMethodError:
10875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNoSuchMethodError
10876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNullPointerException:
10877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNullPointerException
10878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrLogTag:
10880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrLogTag
10881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrExceptionNotCaughtLocally:
10882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrExceptionNotCaughtLocally
10883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNewline:
10885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNewline
10886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrSqueak:
10887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrSqueak
10888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintHex:
10889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintHex
10890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintLong:
10891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintLong
10892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Zero-terminated ASCII string data.
10895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On ARM we have two choices: do like gcc does, and LDR from a .word
10897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the address, or use an ADR pseudo-op to get the address
10898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * directly.  ADR saves 4 bytes and an indirection, but it's using a
10899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PC-relative addressing mode and hence has a limited range, which
10900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it not work well with mergeable string sections.
10901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section .rodata.str1.4,"aMS",%progbits,1
10903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
10905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
10906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
10907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
10908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
10909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
10910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
10911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
10912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
10913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
10914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
10915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
10916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
10917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for objects and 'int'"
10918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
10919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
10920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
10921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
10922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
10923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
10924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
10925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
10926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
10927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NullPointerException;"
10928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrLogTag:
10930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "mterp"
10931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrExceptionNotCaughtLocally:
10932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Exception %s from %s:%d not caught locally\n"
10933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNewline:
10935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "\n"
10936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrSqueak:
10937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%d>"
10938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintHex:
10939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<0x%x>"
10940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintLong:
10941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%lld>"
10942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10944