InterpAsm-armv5te.S revision 861b33855aff080278ea5125e4372a2d4bf8aef5
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)
316ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.Lno_singleStep:
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:
344ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r0,[rGLUE, #offGlue_jitResume]
345ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2,[rGLUE, #offGlue_jitResumePC]
346ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #kInterpEntryResume     @ resuming after Jit single-step?
347ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .Lbad_arg
348ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     rPC,r2
349ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .Lno_singleStep             @ must have branched, don't resume
350ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, #kInterpEntryInstr
35151ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee    str     r1, [rGLUE, #offGlue_entryPoint]
352ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     rINST, .LdvmCompilerTemplate
353ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      r0                          @ re-enter the translation
354ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmCompilerTemplate:
355ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmCompilerTemplateStart
356ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
357ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lbad_arg:
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strBadEntryPoint
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r1 holds value of entryPoint
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAbort
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pushed some registers on the stack in dvmMterpStdRun, then saved
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SP and LR.  Here we restore SP, restore the registers, and then restore
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LR to PC.
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0  MterpGlue* glue
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1  bool changeInterp
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     sp, [r0, #offGlue_bailPtr]      @ sp<- saved SP
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                          @ return the changeInterp value
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4                      @ un-align 64
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDMFD_PC "r4-r10,fp"                    @ restore 9 regs and return
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references.
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrBadEntryPoint:
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrBadEntryPoint
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionStart
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmInstructionStart, %function
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOP.S */
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_inst, %function
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_inst:
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE.S */
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide vA, vB */
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- BBBB
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_16.S */
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- BBBB
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- AAAA
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
513445194bc141dc67e2f678aa1bbd5e59ca66254e5Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT.S */
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_16.S */
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-result-wide vAA */
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_EXCEPTION.S */
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-exception vAA */
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offThread_exception]  @ r3<- dvmGetException bypass
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ r1<- 0
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ dvmClearException bypass
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_VOID.S */
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_WIDE.S */
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 64-bit value.  Copies the return value into the "glue"
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* return-wide vAA */
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ retval<- r0/r1
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_OBJECT.S */
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_4.S */
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/4 vA, #+B */
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r0)                    @ fp[A]<- r1
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_16.S */
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/16 vAA, #+BBBB */
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST.S */
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const vAA, #+BBBBbbbb */
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_HIGH16.S */
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsl #16             @ r0<- BBBB0000
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_16.S */
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_32.S */
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE.S */
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 4)                        @ r3<- HHHH (high)
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #0                      @ r0<- 00000000
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsl #16             @ r1<- BBBB0000
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING.S */
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBB */
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_resolve
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING_JUMBO.S */
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_JUMBO_resolve
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_CLASS.S */
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/class vAA, Class@BBBB */
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_CLASS_resolve
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_ENTER.S */
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Synchronize on an object.
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-enter vAA */
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
88199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         @ need for precise GC, MONITOR_TRACKING
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null object, throw an exception
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLockObject               @ call(self, obj)
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION /* implies WITH_MONITOR_TRACKING */
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offThread_exception] @ check for exception
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ exception raised, bail out
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_EXIT.S */
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlock an object.
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction spec.
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-exit vAA */
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ before fetch: export the PC
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
9116bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     1f                          @ yes
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
9166bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     common_exceptionThrown      @ yes, exception is pending
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9196bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee1:
9206bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    FETCH_ADVANCE_INST(1)               @ advance before throw
9216bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    b      common_errNullObject
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CHECK_CAST.S */
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* check-cast vAA, class@BBBB */
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- BBBB
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r3)                    @ r9<- object
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_methodClassDex]    @ r0<- pDvmDex
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ is object null?
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved:
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay:
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INSTANCE_OF.S */
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if an object reference is an instance of a class.
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Most common situation is a non-null object, being compared against
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an already-resolved class.
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15                 @ r9<- A
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- pDvmDex
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- CCCC
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ARRAY_LENGTH.S */
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the length of an array.
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yup, fail
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ vB<- length
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_INSTANCE.S */
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new instance of a class.
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-instance vAA, class@BBBB */
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for init, resolve, alloc
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved:   @ r0=class
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized: @ r0=class
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
1021b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    bl      dvmAllocObject              @ r0<- new object
1022b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    b       .LOP_NEW_INSTANCE_finish          @ continue
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_ARRAY.S */
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- CCCC
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r0)                    @ r1<- vB (array length)
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ check length
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_errNegativeArraySize @ negative length, bail
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for resolve, alloc
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_continue
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC();
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ 0 means an exception is thrown
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ has exception
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_THROW.S */
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception object in the current thread.
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* throw vAA */
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, throw an NPE instead
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ bypass dvmSetException, just store it
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ thread->exception<- obj
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO.S */
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 8-bit offset.
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto +AA */
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asr #24             @ r9<- ssssssAA (sign-extended)
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r9, lsl #1              @ r9<- byte offset
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_16.S */
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 16-bit offset.
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/16 +AAAA */
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- byte offset, check sign
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1186ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_32.S */
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 32-bit offset.
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * our "backward branch" test must be "<=0" instead of "<0".  The ORRS
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction doesn't affect the V flag, so we need to clear it
1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * explicitly.
1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/32 +AAAAAAAA */
1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, ip                      @ (clear V flag during stall)
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    r0, r0, r1, lsl #16         @ r0<- AAAAaaaa, check sign
1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0, asl #1              @ r9<- byte offset
1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble     common_backwardBranch       @ backward branch, do periodic checks
1220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1268ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPARSE_SWITCH.S */
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1297ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1305ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish:
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_FLOAT.S */
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish:
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_DOUBLE.S */
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMP_LONG.S */
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register based on the results of the comparison.
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We load the full values with LDM, but in practice many values could
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be resolved by only looking at the high word.  This could be made
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * faster or slower by splitting the LDM into a pair of LDRs.
1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If we just wanted to set condition flags, we could do this:
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subs    ip, r0, r2
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  sbcs    ip, r1, r3
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subeqs  ip, r0, r2
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * integer value, which we can do with 2 conditional mov/mvn instructions
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * us a constant 5-cycle path plus a branch at the end to the
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction epilogue code.  The multi-compare approach below needs
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the worst case (the 64-bit values are equal).
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt     .LOP_CMP_LONG_greater
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r1, r0, r2                  @ r1<- r0 - r2
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CMP_LONG_less
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQ.S */
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1554ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1555ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1556ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1557ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1558ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1559ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1560ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1563ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NE.S */
1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1591ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1592ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1593ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1594ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1595ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1596ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1600ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LT.S */
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1628ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1629ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1630ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1631ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1632ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1633ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1634ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1637ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GE.S */
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1665ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1666ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1667ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1668ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1669ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1670ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GT.S */
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1702ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1704ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1705ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1706ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1707ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LE.S */
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1739ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1740ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1741ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1742ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1745ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1748ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQZ.S */
1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1773ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1774ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1775ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1776ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1777ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1778ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1781ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1782ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1783ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1784ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1785ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NEZ.S */
1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1810ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1811ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1812ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1813ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1814ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1815ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1818ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1819ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1820ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1821ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1822ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */
1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LTZ.S */
1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1847ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1848ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1849ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1850ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1851ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1852ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1855ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1856ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1857ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1858ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1859ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */
1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GEZ.S */
1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1884ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1885ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1886ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1887ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1888ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1889ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1890ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1891ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1892ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1893ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1896ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GTZ.S */
1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1921ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1922ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1923ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1924ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1925ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1926ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1927ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1928ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1929ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1930ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1933ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LEZ.S */
1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1958ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1959ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1960ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1961ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1962ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1963ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1966ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1967ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1968ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1969ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1970ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3E.S */
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3F.S */
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_40.S */
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_41.S */
2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_42.S */
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_43.S */
2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_WIDE.S */
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aget-wide vAA, vBB, vCC */
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_OBJECT.S */
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BOOLEAN.S */
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BYTE.S */
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_CHAR.S */
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_SHORT.S */
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_WIDE.S */
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 64 bits.  vBB[vCC] <- vAA.
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aput-wide vAA, vBB, vCC */
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_OBJECT.S */
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Store an object into an array.  vBB[vCC] <- vAA.
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vBB (array object)
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null array object?
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r9)                    @ r9<- vAA
2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offArrayObject_length]    @ r3<- arrayObj->length
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r1, r0, lsl #2         @ r10<- arrayObj + index*width
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r3                      @ compare unsigned index, length
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BOOLEAN.S */
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BYTE.S */
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_CHAR.S */
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_SHORT.S */
2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish          @ no, already resolved
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE.S */
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Wide 32-bit instance field get.
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide vA, vB, field@CCCC */
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT.S */
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BOOLEAN.S */
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BYTE.S */
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_CHAR.S */
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_SHORT.S */
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ no, already resolved
2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ yes, finish up
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE.S */
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide vA, vB, field@CCCC */
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT.S */
2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BOOLEAN.S */
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BYTE.S */
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_CHAR.S */
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_SHORT.S */
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_resolve         @ yes, do resolve
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish: @ field ptr in r0
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_WIDE.S */
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:
2893861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2894861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
2895861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2896861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
2897861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
2898861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2899861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
2900861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2902861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_OBJECT.S */
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish: @ field ptr in r0
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BOOLEAN.S */
2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BYTE.S */
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish: @ field ptr in r0
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_CHAR.S */
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish: @ field ptr in r0
3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_SHORT.S */
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish: @ field ptr in r0
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
3039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_resolve         @ yes, do resolve
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish:   @ field ptr in r0
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_WIDE.S */
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SPUT handler.
3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sput-wide vAA, field@BBBB */
3068861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]  @ r0<- DvmDex
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3070861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
3072861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
3074861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
3076861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3078861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
3079861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
3080861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
3081861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
3082861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
3083861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
3084861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
3085861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
3086861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_OBJECT.S */
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BOOLEAN.S */
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BYTE.S */
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_CHAR.S */
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_SHORT.S */
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange   @ no, continue on
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ yes, continue on
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ no, continue
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_invokeMethodNoRange @ jump to common handler
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_73.S */
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange   @ no, continue on
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ yes, continue on
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ no, continue
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_invokeMethodRange @ jump to common handler
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_79.S */
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_7A.S */
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_INT.S */
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_INT.S */
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_LONG.S */
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_LONG.S */
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                           @ optional op; may set condition codes
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_FLOAT.S */
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_DOUBLE.S */
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_LONG.S */
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_FLOAT.S */
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2f                              @ r0<- op, r0-r3 changed
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_DOUBLE.S */
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2d                              @ r0<- op, r0-r3 changed
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_INT.S */
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_FLOAT.S */
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_INT.S */
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                              @ r0<- op, r0-r3 changed
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unop.S" {"instr":"bl      f2i_doconv"}
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to an int in r0.
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2i_doconv:
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x4f000000             @ (float)maxint
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxint?
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xcf000000             @ (float)minint
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minint?
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                @ convert float to int
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_LONG.S */
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2d                              @ r0<- op, r0-r3 changed
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_INT.S */
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                              @ r0<- op, r0-r3 changed
4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl      d2i_doconv"}
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0.
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv:
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
40435162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0x80000000             @ maxint, as a double (low word)
40445162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, r2, asr #9              @  0xffc00000
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
40465162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvn     r3, #0xbe000000             @ maxint, as a double (high word)
40475162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    sub     r3, r3, #0x00200000         @  0x41dfffff
40485162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxint?
4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
40525162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvnne   r0, #0x80000000             @ return maxint (0x7fffffff)
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
40575162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc1000000             @ minint, as a double (high word)
40585162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, r3, #0x00e00000         @  0xc1e00000
40595162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minint, as a double (low word)
4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minint?
4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ return zero for NaN
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                @ convert double to int
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_LONG.S */
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2f                              @ r0<- op, r0-r3 changed
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_BYTE.S */
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #24                           @ optional op; may set condition codes
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_CHAR.S */
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_SHORT.S */
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT.S */
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT.S */
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT.S */
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT.S */
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT.S */
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT.S */
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT.S */
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT.S */
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT.S */
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT.S */
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT.S */
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG.S */
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG.S */
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG.S */
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        WX
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      x YZ
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  --------
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     ZW ZX
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  YW YX
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The low word of the result holds ZX, the high word holds
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * it doesn't fit in the low 64 bits.
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most ARM math operations, multiply instructions have
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * restrictions on using the same register more than once (Rd and Rm
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cannot be the same).
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_MUL_LONG_finish
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG.S */
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG.S */
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG.S */
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG.S */
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG.S */
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG.S */
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_finish
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG.S */
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_finish
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG.S */
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long vAA, vBB, vCC */
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_finish
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT.S */
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT.S */
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT.S */
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT.S */
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT.S */
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE.S */
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE.S */
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE.S */
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE.S */
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE.S */
5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_2ADDR.S */
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5592a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT_2ADDR.S */
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5632a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_2ADDR.S */
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5673a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_2ADDR.S */
5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5713a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_2ADDR.S */
5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5754a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
5773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_2ADDR.S */
5774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5794a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_2ADDR.S */
5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5834a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_2ADDR.S */
5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5874a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_2ADDR.S */
5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5914a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_2ADDR.S */
5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5954a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_2ADDR.S */
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5994a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG_2ADDR.S */
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG_2ADDR.S */
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG_2ADDR.S */
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, "/2addr" version.
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_MUL_LONG for an explanation.
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We get a little tight on registers, so to avoid looking up &fp[A]
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again we stuff it into rINST.
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG_2ADDR.S */
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG_2ADDR.S */
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG_2ADDR.S */
6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG_2ADDR.S */
6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_2ADDR_finish
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long/2addr vA, vB */
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_2ADDR_finish
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long/2addr vA, vB */
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_2ADDR_finish
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6438a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6478a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6518a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6558a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6599a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT16.S */
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */
6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT.S */
6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT16.S */
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT16.S */
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT16.S */
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT16.S */
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT16.S */
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT16.S */
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT8.S */
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT_LIT8.S */
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT8.S */
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT8.S */
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT8.S */
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT8.S */
7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT8.S */
7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT8.S */
7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
7442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_LIT8.S */
7443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
7481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_LIT8.S */
7482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
7520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_LIT8.S */
7521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E3: /* 0xe3 */
7559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E3.S */
7560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E4: /* 0xe4 */
7568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E4.S */
7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E5: /* 0xe5 */
7577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E5.S */
7578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E6: /* 0xe6 */
7586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E6.S */
7587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E7: /* 0xe7 */
7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E7.S */
7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
76045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
76055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE.S */
76065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Wide 32-bit instance field get.
76085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iget-wide vA, vB, field@CCCC */
76105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
76115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
76125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
76135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
76145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
76155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
76165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
76185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
76195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
76205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
76215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
76225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0
76235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish
76245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
76305387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
76315387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE.S */
76325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iput-wide vA, vB, field@CCCC */
76335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
76345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
76355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
76365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
76375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
76385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
76395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
76415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
76425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
76435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
76445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
76455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
76465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
76475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76525387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
76535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
76545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE.S */
76555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SGET handler.
76575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sget-wide vAA, field@BBBB */
76595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
76605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
76615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
76625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
76635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
76645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
76655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_finish:
7666861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7667861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7668861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7669861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
7670861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7671861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7672861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7673861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
76745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7675861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
76765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
76775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
76835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
76845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE.S */
76855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
76865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SPUT handler.
76875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
76885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sput-wide vAA, field@BBBB */
7689861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]  @ r0<- DvmDex
76905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
7691861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
76925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7693861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
76945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7695861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
76965387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7697861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
76985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7699861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7700861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7701861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7702861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7703861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
7704861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7705861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7706861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7707861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
7708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
771296516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
771396516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: armv5te/OP_BREAKPOINT.S */
7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
77213a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
77223a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
77233a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /*
77243a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * Handle a throw-verification-error instruction.  This throws an
77253a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception for an error discovered during verification.  The
77263a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception is indicated by AA, with some detail provided by BBBB.
77273a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     */
77283a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /* op AA, ref@BBBB */
7729b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
77303a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    FETCH(r2, 1)                        @ r2<- BBBB
7731b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    EXPORT_PC()                         @ export the PC
77323a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     r1, rINST, lsr #8           @ r1<- AA
77333a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    bl      dvmThrowVerificationError   @ always throws
77343a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    b       common_exceptionThrown      @ handle exception
7735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
7740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_EXECUTE_INLINE.S */
7741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
7743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7744b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7745b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7747b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7748b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7749b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 1)                       @ r10<- BBBB
7753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ can throw
7755b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [sp]                    @ push &glue->retval
7758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ pop stack
7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ test boolean result of inline
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ returned false, handle exception
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7768b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7769b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7770b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
7771b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Execute a "native inline" instruction, using "/range" semantics.
7772b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Same idea as execute-inline, but we get the args differently.
7773b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7774b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7775b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7776b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7777b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7778b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7779b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7780b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
7781b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7782b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r10, 1)                       @ r10<- BBBB
7783b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7784b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    EXPORT_PC()                         @ can throw
7785b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7786b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
7787b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    str     r1, [sp]                    @ push &glue->retval
7788b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7789b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     sp, sp, #8                  @ pop stack
7790b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    cmp     r0, #0                      @ test boolean result of inline
7791b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    beq     common_exceptionThrown      @ returned false, handle exception
7792b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7793b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7794b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_EMPTY.S */
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_F1.S */
7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide-quick vA, vB, offset@CCCC */
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r0, [r3, r1]                @ r0<- obj.field (64 bits, aligned)
7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide-quick vA, vB, offset@CCCC */
7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A(+)
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ check object for null
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- field byte offset
7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
8012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
8013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
8014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
8015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
8016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
8017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
8018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
8023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
8024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
8025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
8029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
8031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
8032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
8033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
8035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
8040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
8041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
8042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
8043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
8044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
8045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
8046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
8047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FC: /* 0xfc */
8053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FC.S */
8054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FD: /* 0xfd */
8062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FD.S */
8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FE: /* 0xfe */
8071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FE.S */
8072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
8080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FF.S */
8081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
8082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
8089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionEnd
8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd:
8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Sister implementations
8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterStart
8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmSisterStart, %function
8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 4
8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart:
8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */
8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (String ref)
8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve:
8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBBBBBB (String ref)
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the Class has not yet been resolved.
8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (Class ref)
8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve:
8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- Class reference
8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */
8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_okay            @ no, success
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ A cast has failed.  We need to throw a ClassCastException with the
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ class of the object that failed to be cast.
8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ about to throw
8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]  @ r3<- obj->clazz
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .LstrClassCastExceptionPtr
8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r3, #offClassObject_descriptor] @ r1<- obj->clazz->descriptor
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowExceptionWithClassMessage
8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds BBBB
8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve:
8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- BBBB
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastExceptionPtr:
8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrClassCastException
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */
8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_INSTANCE_OF_store
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r0 holds boolean result
8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r9 holds A
8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store:
8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test succeeded, save and bail.
8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial:
8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #1                      @ indicate success
8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r3 holds BBBB
8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve:
8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r3                      @ r1<- BBBB
8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 32                          @ minimize cache lines
8268b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden.LOP_NEW_INSTANCE_finish: @ r0=new object
8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class initialization required.
8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class object
8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0                      @ save r0
8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInitClass                @ initialize class
8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ check boolean result
8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ restore r0
8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ failed, deal with init exception
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds BBBB
8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationErrorPtr:
8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInstantiationError
8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */
8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds class ref CCCC
8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve:
8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ r9<- length (save)
8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- CCCC
8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ r1<- length (restore)
8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_NEW_ARRAY_finish
8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation.
8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class
8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish:
8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ vA<- r0
8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #'I'                    @ array of ints?
8365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'L'                    @ array of objects?
8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'['                    @ array of arrays?
8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
8414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)                 @ define in one or the other, not both
8420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #'I'                    @ array of ints?
8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'L'                    @ array of objects?
8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'['                    @ array of arrays?
8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
8487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
8493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)                 @ define in one or the other, not both
8499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
8507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_gt_or_nan:
8512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_FLOAT_finish
8518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_FLOAT_finish
8520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_continue
8539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_continue:
8542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPL_FLOAT_nan               @ no, must be NaN
8549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_finish:
8553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_nan:
8564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_finish
8566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
8571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_gt_or_nan:
8576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_FLOAT_finish
8582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_FLOAT_finish
8584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_continue
8603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_continue:
8606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPG_FLOAT_nan               @ no, must be NaN
8613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_finish:
8617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_nan:
8628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_finish
8630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
8635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_gt_or_nan:
8640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_DOUBLE_finish
8646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_DOUBLE_finish
8648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
8651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_gt_or_nan:
8656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_DOUBLE_finish
8662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_DOUBLE_finish
8664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */
8667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_less:
8669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                      @ r1<- -1
8670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Want to cond code the next mov so we can avoid branch, but don't see it;
8671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ instead, we just replicate the tail end.
8672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)                    @ vAA<- r1
8674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_greater:
8678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ r1<- 1
8679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish:
8682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)                    @ vAA<- r1
8684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */
8689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish:
8691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
8694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
8696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */
8700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish:
8702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
8704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */
8710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = vBB (arrayObj)
8713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = vAA (obj)
8714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = offset into array (vBB + vCC * width)
8715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_finish:
8717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ storing null reference?
8718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
8719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offObject_clazz]  @ r1<- arrayObj->clazz
8721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCanPutArrayElement       @ test object type vs. array type
8722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ okay?
8723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errArrayStore        @ no
8724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
8725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
8728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */
8732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish:
8739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */
8753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish:
8760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8763861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
8764861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
8765861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
8766861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
8768861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8769861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8771861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
8772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */
8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish:
8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */
8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish:
8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */
8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish:
8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */
8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish:
8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */
8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish:
8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */
8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish:
8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
8920861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8921861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
8922861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- target address
8923861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
8924861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8925861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
8926861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8927861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
8928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */
8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish:
8938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
8959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */
8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish:
8980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
8981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */
8994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish:
9001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
9002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
9003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
9005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
9006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
9007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
9008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */
9015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
9018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
9019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
9020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish:
9022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
9023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
9024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
9026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
9027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
9028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
9029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */
9036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve:
9042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_finish          @ yes, finish
9048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */
9052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9056861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9057861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
9058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve:
9060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_WIDE_finish          @ yes, finish
9066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */
9070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve:
9076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_OBJECT_finish          @ yes, finish
9082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
9086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve:
9092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_BOOLEAN_finish          @ yes, finish
9098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */
9102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve:
9108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_BYTE_finish          @ yes, finish
9114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */
9118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve:
9124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_CHAR_finish          @ yes, finish
9130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */
9134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve:
9140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_SHORT_finish          @ yes, finish
9146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */
9150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve:
9156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_finish          @ yes, finish
9162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */
9166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: &fp[AA]
9171861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9172861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
9173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve:
9175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9180861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
9181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_WIDE_finish          @ yes, finish
9182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
9186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_resolve:
9192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_OBJECT_finish          @ yes, finish
9198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
9202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
9208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BOOLEAN_finish          @ yes, finish
9214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */
9218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve:
9224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BYTE_finish          @ yes, finish
9230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */
9234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve:
9240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_CHAR_finish          @ yes, finish
9246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */
9250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
9253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
9254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve:
9256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
9257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
9258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
9261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_SHORT_finish          @ yes, finish
9262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
9263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
9266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
9273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r10)                   @ r1<- "this" ptr
9274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is "this" null?
9276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
9277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
9278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
9281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
9284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
9289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue:
9291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
9292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
9295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
9297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
9300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
9302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
9303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
9307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
9314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
9319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
9326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
9333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */
9337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue:
9344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r10)                   @ r1<- "this" ptr
9345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is "this" null?
9347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
9348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
9349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
9352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
9355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
9360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
9362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
9363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
9366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
9368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
9371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
9373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
9374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
9378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
9385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
9390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
9397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
9404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
9408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to a long in r0/r1.
9410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2l_doconv:
9416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
9417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x5f000000             @ (float)maxlong
9418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
9419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxlong?
9420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffff)
9422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xdf000000             @ (float)minlong
9427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minlong?
9428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (80000000)
9430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
9435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
9436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}
9439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2lz                @ convert float to long
9442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
9443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
9446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to a long in r0/r1.
9448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2l_doconv:
9454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
94555162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0x43000000             @ maxlong, as a double (high word)
94565162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0x43e00000
94575162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ maxlong, as a double (low word)
9458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
94595162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
9460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
9461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxlong?
9462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
9464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
94695162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc3000000             @ minlong, as a double (high word)
94705162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0xc3e00000
94715162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minlong, as a double (low word)
9472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minlong?
9473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (8000000000000000)
9475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
9481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
9482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
9483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f
9486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2lz                @ convert double to long
9490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
9492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
9493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
9494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */
9497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_finish:
9499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
9501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */
9505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish:
9507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
9508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */
9514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish:
9516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
9517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */
9523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish:
9525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
9526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
9532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
9534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
9540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
9542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
9548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
9550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
95555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IGET_WIDE_VOLATILE */
95565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
95585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
95595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
95605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
95615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
95625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IGET_WIDE_VOLATILE_finish:
95635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
95645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
95655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
9566861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
9567861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
9568861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
9569861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
95705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
9571861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
9572861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
95735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9574861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
95755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
95765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
95775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
95785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
95795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IPUT_WIDE_VOLATILE */
95825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
95835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
95845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
95855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
95865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
95875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
95885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IPUT_WIDE_VOLATILE_finish:
95895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
95905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
95915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    and     r2, r2, #15                 @ r2<- A
95925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
95935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
95945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
95955387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
95965387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
9597861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
9598861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
9599861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- target address
9600861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
9601861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
9602861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
9603861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
9604861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
96055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SGET_WIDE_VOLATILE */
96085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
96105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
96115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
9612861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9613861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
96145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
96155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_resolve:
96165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
96175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
96185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
96195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
96205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
96215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SGET_WIDE_VOLATILE_finish          @ yes, finish
96225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
96235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SPUT_WIDE_VOLATILE */
96265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
96285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
96295387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
96305387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9: &fp[AA]
9631861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9632861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
96335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
96345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SPUT_WIDE_VOLATILE_resolve:
96355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
96365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
96375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
96385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
96395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
9640861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
96415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SPUT_WIDE_VOLATILE_finish          @ yes, finish
96425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
96435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
96445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
9645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
9646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Extract args, call function.
9649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = #of args (0-4)
9650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = call index
9651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
9653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Other ideas:
9654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Use a jump table from the main piece to jump directly into the
9655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   AND/LDR pairs.  Costs a data load, saves a branch.
9656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Have five separate pieces that do the loading, so we can work the
9657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   interleave a little better.  Increases code size.
9658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
9660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #4                  @ r0<- 4-r0
9661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r9, 2)                        @ r9<- FEDC
9662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
9664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r9, #0xf000             @ isolate F
9665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
9666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r9, #0x0f00             @ isolate E
9667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
9668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r9, #0x00f0             @ isolate D
9669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
9670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r9, #0x000f             @ isolate C
9671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
9672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:
9673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, .LOP_EXECUTE_INLINE_table       @ table of InlineOperation
9674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (not reached)
9676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_table:
9678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   gDvmInlineOpsTable
9679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9681b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* continuation for OP_EXECUTE_INLINE_RANGE */
9682b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9683b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
9684b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Extract args, call function.
9685b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r0 = #of args (0-4)
9686b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r10 = call index
9687b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9688b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
9689b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_continue:
9690b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    rsb     r0, r0, #4                  @ r0<- 4-r0
9691b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r9, 2)                        @ r9<- CCCC
9692b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9693b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      common_abort                @ (skipped due to ARM prefetch)
9694b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden4:  add     ip, r9, #3                  @ base+3
9695b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r3, ip)                    @ r3<- vBase[3]
9696b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden3:  add     ip, r9, #2                  @ base+2
9697b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r2, ip)                    @ r2<- vBase[2]
9698b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden2:  add     ip, r9, #1                  @ base+1
9699b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r1, ip)                    @ r1<- vBase[1]
9700b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden1:  add     ip, r9, #0                  @ (nop)
9701b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r0, ip)                    @ r0<- vBase[0]
9702b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden0:
9703b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
9704b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9705b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    @ (not reached)
9706b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9707b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_table:
9708b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    .word   gDvmInlineOpsTable
9709b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9710b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
9712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterEnd
9713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd:
9714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/footer.S */
9716ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Common subroutines and data
9720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
9726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
9727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9728ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
972997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
973097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpPunt
973197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpPunt:
973297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
973397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      dvmJitSelfVerificationEnd    @ doesn't return
973497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
973597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpSingleStep
973697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpSingleStep:
973797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
973897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      dvmJitSelfVerificationEnd    @ doesn't return
973997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
974040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
974140094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
974240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC                       @ pass our target PC
974340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
974440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    b      dvmJitSelfVerificationEnd    @ doesn't return
974540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng
974640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
974740094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
97489a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
974997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
975097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      dvmJitSelfVerificationEnd    @ doesn't return
975197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
975240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpBackwardBranch
975340094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpBackwardBranch:
97549a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
975597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
975697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      dvmJitSelfVerificationEnd    @ doesn't return
975797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
975897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNormal
975997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNormal:
97609a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
976197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
976297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      dvmJitSelfVerificationEnd    @ doesn't return
976397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
976497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNoChain
976597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNoChain:
976697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r0,rPC                       @ pass our target PC
976797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
976897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      dvmJitSelfVerificationEnd    @ doesn't return
976997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
9770ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9771ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter when the compiler is
9772ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * having issues translating/executing a Dalvik instruction. We have to skip
9773ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the code cache lookup otherwise it is possible to indefinitely bouce
9774ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * between the interpreter and the code cache if the instruction that fails
9775ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to be compiled happens to be at a trace start.
9776ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9777ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpPunt
9778ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpPunt:
97797a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
9780ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC, r0
978186717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
9782ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,lr
9783ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpPunt;
9784ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9785ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
97867a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov    r0, #0
97877a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9788ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9789ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9790ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9791ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9792ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9793ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9794ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return to the interpreter to handle a single instruction.
9795ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * On entry:
9796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r0 <= PC
9797ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r1 <= PC of resume instruction
9798ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    lr <= resume point in translation
9799ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9800ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpSingleStep
9801ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpSingleStep:
9802ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    lr,[rGLUE,#offGlue_jitResume]
9803ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r1,[rGLUE,#offGlue_jitResumePC]
9804ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#kInterpEntryInstr
9805ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ enum is 4 byte in aapcs-EABI
9806ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r1, [rGLUE, #offGlue_entryPoint]
9807ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC,r0
9808ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
98097a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng
9810ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9811ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r2,#kJitSingleStep     @ Ask for single step and then revert
9812ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r2,[rGLUE,#offGlue_jitState]
9813ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#1                  @ set changeInterp to bail to debug interp
9814ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b      common_gotoBail
9815ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
981640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
981740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * Return from the translation cache and immediately request
981840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * a translation for the exit target.  Commonly used for callees.
981940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
982040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
982140094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
982286717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
982340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmBumpNoChain
982440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng#endif
982540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
982640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC
982740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
982840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
982940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r1, rPC                  @ arg1 of translation may need this
983040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
983140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    cmp    r0,#0
983240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bxne   r0                       @ continue native execution if so
983340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    b      2f
9834ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9835ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9836ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache and immediately request
9837ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a translation for the exit target.  Commonly used following
9838ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * invokes.
9839ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
984040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
984140094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
98429a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
98437a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
98449a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
9845ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
98467a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    bl     dvmJitGetCodeAddr       @ Is there a translation?
98477a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
9848ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
9849ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq    2f
9850ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
9851ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
98529a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
98539a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
985446cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
985546cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
985646cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
9857ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9858ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* No translation, so request one if profiling isn't disabled*/
9859ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng2:
98601da12167d913efde56ec3b40491524b051679f2cAndy McFadden    adrl   rIBASE, dvmAsmInstructionStart
9861ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9862ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9863ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0, #0
986440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
9865ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne    common_selectTrace
9866ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9867ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9868ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9869ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9870ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter.
9871ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The return was done with a BLX from thumb mode, and
9872ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the following 32-bit word contains the target rPC value.
9873ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Note that lr (r14) will have its low-order bit set to denote
9874ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * its thumb-mode origin.
9875ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
9876ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We'll need to stash our lr origin away, recover the new
9877ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * target and then check to see if there is a translation available
9878ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for our new target.  If so, we do a translation chain and
9879ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * go back to native execution.  Otherwise, it's back to the
9880ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * interpreter (after treating this entry as a potential
9881ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace start).
9882ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9883ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNormal
9884ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNormal:
98859a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
98867a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
98879a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
988886717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
9889ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNormal
9890ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9891ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
9892ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
98937a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
9894ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
989546cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    beq    toInterpreter            @ go if not, otherwise do chain
9896ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
9897ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
98989a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
98999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
990046cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
990146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
990246cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
9903ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9904ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9905ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter to do method invocation.
9906ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Check if translation exists for the callee, but don't chain to it.
9907ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9908ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNoChain
9909ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNoChain:
991086717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
9911ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNoChain
9912ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
99137a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
9914ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
9915ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
99167a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
99179a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
99189a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
9919ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
9920ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne   r0                       @ continue native execution if so
992197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
9922ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9923ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9924ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * No translation, restore interpreter regs and start interpreting.
9925ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * rGLUE & rFP were preserved in the translated code, and rPC has
9926ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * already been restored by the time we get here.  We'll need to set
9927ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * up rIBASE & rINST, and load the address of the JitTable into r0.
9928ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
992946cd5b63c29d3284a9ff3e0d0711fb136f409313Bill BuzbeetoInterpreter:
9930ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
9931ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9932ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9933ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9934ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ NOTE: intended fallthrough
9935ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9936ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Common code to update potential trace start counter, and initiate
9937ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a trace-build if appropriate.  On entry, rPC should point to the
9938ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * next instruction to execute, and rINST should be already loaded with
9939ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the next opcode word, and r0 holds a pointer to the jit profile
9940ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * table (pJitProfTable).
9941ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9942ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_testUpdateProfile:
9943ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
9944ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9945ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFEQ(ip)       @ if not profiling, fallthrough otherwise */
9946ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9947ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_updateProfile:
9948ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
99497b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
99507b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
9951ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9952ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    r1,r1,#1           @ decrement counter
99537b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
9954ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
9955ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9956ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9957ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Here, we switch to the debug interpreter to request
9958ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace selection.  First, though, check to see if there
9959ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * is already a native translation in place (and, if so,
9960ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * jump to it now).
9961ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9962d726991ba52466cde88e37aba4de2395b62477faBill Buzbee    GET_JIT_THRESHOLD(r1)
99637a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self
99647b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
9965ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
9966ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0,rPC
9967ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
99687a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
99697a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r1, rPC                     @ arg1 of translation may need this
99707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
9971ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
997297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
9973ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    r0                          @ jump to the translation
997440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     r2,#kJitTSelectRequest      @ ask for trace selection
997540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    @ fall-through to common_selectTrace
997697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
997740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
99789a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    beq     common_selectTrace
99799a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
99809a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * At this point, we have a target translation.  However, if
99819a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * that translation is actually the interpret-only pseudo-translation
99829a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * we want to treat it the same as no translation.
99839a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
99849a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r10, r0                      @ save target
99859a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bl      dvmCompilerGetInterpretTemplate
99869a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    cmp     r0, r10                      @ special case?
99879a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bne     dvmJitSelfVerificationStart  @ set up self verification
99889a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GET_INST_OPCODE(ip)
99899a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GOTO_OPCODE(ip)
99909a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /* no return */
999197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
99929a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
999340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
999440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * On entry:
999540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
999640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
9997ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_selectTrace:
9998ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r2,[rGLUE,#offGlue_jitState]
99999c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    mov     r2,#kInterpEntryInstr       @ normal entry reason
100009c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    str     r2,[rGLUE,#offGlue_entryPoint]
10001ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1,#1                       @ set changeInterp
10002ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b       common_gotoBail
10003ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1000497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
1000597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
1000697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Save PC and registers to shadow memory for self verification mode
1000797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping to native translation.
100089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * On entry, r10 contains the address of the target translation.
1000997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
1001097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitSelfVerificationStart:
1001197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r0,rPC                      @ r0<- program counter
1001297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r1,rFP                      @ r1<- frame pointer
1001397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r2,rGLUE                    @ r2<- InterpState pointer
100149a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r3,r10                      @ r3<- target translation
1001597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl      dvmSelfVerificationSaveState @ save registers to shadow space
10016ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
10017ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    add     rGLUE,r0,#offShadowSpace_interpState @ rGLUE<- rGLUE in shadow space
10018ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    bx      r10                         @ jump to the translation
1001997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1002097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
1002197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Restore PC, registers, and interpState to original values
1002297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping back to the interpreter.
1002397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
1002497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitSelfVerificationEnd:
100256999d84e2c55dc4a46a6c311b55bd5811336d9c4Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
100266999d84e2c55dc4a46a6c311b55bd5811336d9c4Ben Cheng    mov    r1, #0
100276999d84e2c55dc4a46a6c311b55bd5811336d9c4Ben Cheng    str    r1, [r10, #offThread_inJitCodeCache] @ Back to the interp land
1002897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,rFP                        @ pass ending fp
1002997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
10030ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rPC,[r0,#offShadowSpace_startPC] @ restore PC
10031ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rFP,[r0,#offShadowSpace_fp]   @ restore FP
10032ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rGLUE,[r0,#offShadowSpace_glue] @ restore InterpState
10033ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
1003497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    cmp    r1,#0                         @ check for punt condition
1003597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    beq    1f
1003697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kJitSelfVerification      @ ask for self verification
1003797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    str    r2,[rGLUE,#offGlue_jitState]
1003830f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    mov    r2,#kInterpEntryInstr         @ normal entry reason
1003930f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    str    r2,[rGLUE,#offGlue_entryPoint]
1004097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,#1                         @ set changeInterp
1004197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      common_gotoBail
1004297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1004397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao1:                                       @ exit to interpreter without check
1004497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    EXPORT_PC()
1004597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    adrl   rIBASE, dvmAsmInstructionStart
1004697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    FETCH_INST()
1004797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GET_INST_OPCODE(ip)
1004897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GOTO_OPCODE(ip)
1004997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
1005097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
10051ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10052ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
10053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backward branch is taken.
10055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is PC adjustment *in bytes*
10058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
10060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryInstr
10061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10062ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10063ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10064ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
10065ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10066ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10067ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
10068ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
10069ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
10071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10073ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Need to see if the thread needs to be suspended or debugger/profiler
10078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * activity has begun.
10079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: if JDWP isn't running, zero out pDebuggerActive pointer so we don't
10081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have to do the second ldr.
10082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: reduce this so we're just checking a single location.
10084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is reentry type, e.g. kInterpEntryInstr
10087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is trampoline PC adjustment *in bytes*
10088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
10090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_pSelfSuspendCount] @ r3<- &suspendCount
10091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100929c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    @ speculatively store r0 before it is clobbered by dvmCheckSuspendPending
100939c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    str     r0, [rGLUE, #offGlue_entryPoint]
100949c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng
10095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
10096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_pDebuggerActive]   @ r1<- &debuggerActive
10097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER)
10099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_pActiveProfilers]  @ r2<- &activeProfilers
10100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3]                    @ r3<- suspendCount (int)
10103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
10105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r1]                    @ r1<- debuggerActive (boolean)
10106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined (WITH_PROFILER)
10108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
10109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ suspend pending?
1011299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    bne     2f                          @ yes, do full suspension check
10113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
10115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
10116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    r1, r1, r2                  @ r1<- r1 | r2
10117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ debugger attached or profiler started?
10118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# elif defined(WITH_DEBUGGER)
10119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ debugger attached?
10120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# elif defined(WITH_PROFILER)
10121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ profiler started?
10122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# endif
10123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     3f                          @ debugger/profiler, switch interp
10124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr                          @ nothing to do, return
10127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  @ check suspend
10129964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10130964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    /*
10131964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * Refresh the Jit's cached copy of profile table pointer.  This pointer
10132964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * doubles as the Jit's on/off switch.
10133964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     */
10134964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ r10<-&gDvmJit.pJitProfTable
10135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
10136964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3] @ r10 <- pJitProfTable
1013799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         @ need for precise GC
10138964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh Jit's on/off switch
10139964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#else
10140964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
10141964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    EXPORT_PC()                         @ need for precise GC
10142964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       dvmCheckSuspendPending      @ suspend if necessary, then return
10144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  @ debugger/profiler enabled, bail out
10146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, rPC, r9                @ update rPC
10147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ "want switch" = true
10148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_gotoBail
10149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The equivalent of "goto bail", this calls through the "bail handler".
10153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * State registers will be saved to the "glue" area before bailing.
10155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1 is "bool changeInterp", indicating if we want to switch to the
10158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     other interpreter or just bail all the way out
10159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
10161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
10162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ r0<- glue ptr
10163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       dvmMterpStdBail             @ call(glue, changeInterp)
10164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r1, r1, #1                  @ using (boolean+1)
10166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r0, rGLUE, #offGlue_jmpBuf  @ r0<- &glue->jmpBuf
10167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      _longjmp                    @ does not return
10168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_abort
10169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation with range.
10173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
10176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodRange:
10178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewRange:
10179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
10180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
10181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
10182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LinvokeArgsDone            @ if no args, skip the rest
10183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- CCCC
10184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
10186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (very few methods have > 10 args; could unroll for common cases)
10187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
10188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
10189642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
10190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r1, [r3], #4                @ val = *fp++
10191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r2, r2, #1                  @ count--
10192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r10], #4               @ *outs++ = val
10193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1b                          @ ...while count != 0
10194642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r3, [r0, #offMethod_outsSize]   @ r3<- methodToCall->outsSize
10195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LinvokeArgsDone
10196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation without range.
10199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
10201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
10202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodNoRange:
10204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewNoRange:
10205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
10206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
10207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
10208642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
10209642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
10210642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
10211642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    beq     .LinvokeArgsDone
10212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10213642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    @ r0=methodToCall, r1=GFED, r3=outSize, r2=count, r9=regSize, r10=outs
10214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNonRange:
10215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r2, r2, #5                  @ r2<- 5-r2
10216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
10217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
10218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project5:  and     ip, rINST, #0x0f00          @ isolate A
10219642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
10220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10221642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vA
10222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r1, #0xf000             @ isolate G
10223642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
10224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10225642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vG
10226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r1, #0x0f00             @ isolate F
10227642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
10228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10229642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vF
10230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r1, #0x00f0             @ isolate E
10231642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
10232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10233642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vE
10234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r1, #0x000f             @ isolate D
10235642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
10236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
10237642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vD
10238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  @ fall through to .LinvokeArgsDone
10239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10240642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng.LinvokeArgsDone: @ r0=methodToCall, r3=outSize, r9=regSize
10241642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
10242642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
10243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ find space for the new stack frame, check for overflow
10244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
10245642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
10246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
10247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@    bl      common_dumpRegs
10248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
10249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
10250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, r9                      @ bottom < interpStackEnd?
10251642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
10252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt     .LstackOverflow             @ yes, this frame will overflow stack
10253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ set up newSaveArea
10255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB
10256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
10257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [r10, #offStackSaveArea_prevSave]
10258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r10, #offStackSaveArea_prevFrame]
10260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rPC, [r10, #offStackSaveArea_savedPc]
10261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, #0
10263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r9, [r10, #offStackSaveArea_returnAddr]
10264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r10, #offStackSaveArea_method]
10266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    tst     r3, #ACC_NATIVE
10267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LinvokeNative
10268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
10271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
10272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP
10273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
10275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
10276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
10277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1
10278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
10279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
10280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
10281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
10282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
10283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10284642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
10285642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
10286642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r2                         @ publish new rPC
10287642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
10288642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
10289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Update "glue" values for the new method
10290642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    @ r0=methodToCall, r1=newFp, r2=self, r3=newMethodClass, r9=newINST
10291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
10292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
10293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r1                         @ fp = newFp
10296642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
10297642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rINST, r9                       @ publish new rINST
10298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
10299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                         @ jump to next instruction
10302ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
10304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
10305ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rINST, r9                       @ publish new rINST
10306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
10307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                         @ jump to next instruction
10308ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNative:
10311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Prep for the native call
10312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=newFp, r10=newSaveArea
10313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
10314d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
10315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
10316d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
10317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r3                      @ r9<- glue->self (preserve)
10318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ r2<- methodToCall
10320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                      @ r0<- newFp (points to args)
10321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
10322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
10324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
10325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .Lskip
10326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_mterp, %function
10327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_mterp:
10328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
10329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
10330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
10331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lskip:
10332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @mov     lr, pc                      @ set return addr
10335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
10336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC_LR "[r2, #offMethod_nativeFunc]"
10337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10338964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10339964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ Refresh Jit's on/off status
10340964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10341964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
10342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ native return; r9=self, r10=newSaveArea
10343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ equivalent to dvmPopJniLocals
10344d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
10345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offThread_exception] @ check for exception
10346964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10347964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3]                    @ r3 <- gDvmJit.pProfTable
10348964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
10350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null?
10351d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
10352964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
10353964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh cached on/off switch
10354964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
10355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ no, handle exception
10356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103616ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    @ r0=methodToCall
103626ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    mov     r1, r0                      @ r1<- methodToCall
10363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- self
10364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmHandleStackOverflow
10365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
10367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
10368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Common code for method invocation, calling through "glue code".
10373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TODO: now that we have range and non-range invoke handlers, this
10375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       needs to be split into two.  Maybe just create entry points
10376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       that set r9 and jump here?
10377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
10379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 is "Method* methodToCall", the method we're trying to call
10380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 is "bool methodCallRange", indicating if this is a /range variant
10381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
10383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeOld:
10384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #8                  @ space for args + pad
10385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
10386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ A2<- methodToCall
10387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ A0<- glue
10388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
10389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ A1<- methodCallRange
10390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ A3<- AA
10391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #0]                @ A4<- ip
10392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
10393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ remove arg area
10394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall  @ continue to next instruction
10395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction.
10401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
10403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
10405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnNew:
10406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryReturn
10407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
10408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
10411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
10412642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
10413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
10414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        @ r2<- method we're returning to
10415642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
10416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is this a break frame?
10417642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
10418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
10419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_gotoBail             @ break frame, bail out completely
10420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10421642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
10422642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
10423642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
10424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r3, #offThread_curFrame]  @ self->curFrame = fp
10425ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
104267a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
10427ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
10428ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rPC, r9                     @ publish new rPC
10429ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [rGLUE, #offGlue_methodClassDex]
104307a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r10, [r3, #offThread_inJitCodeCache]  @ may return to JIT'ed land
104317a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    cmp     r10, #0                      @ caller is compiled code
104327a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    blxne   r10
10433ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10434ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
10435ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
10436ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
10437ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
10438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10439642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r9                     @ publish new rPC
10440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_methodClassDex]
10441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10442ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
10443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return handling, calls through "glue code".
10446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
10448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnOld:
10449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
10450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
10451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_returnFromMethod
10452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
10453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
10458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
10460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
10461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
10462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
10464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10465ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     .global dvmMterpCommonExceptionThrown
10466ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmMterpCommonExceptionThrown:
10467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
10468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionNew:
10469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryThrow
10470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
10471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
10472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r10, [rGLUE, #offGlue_self] @ r10<- glue->self
10474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r10, #offThread_exception] @ r9<- self->exception
10475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
10478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- NULL
10479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r10, #offThread_exception] @ self->exception = NULL
10480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up args and a local for "&fp" */
10482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
10483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [sp, #-4]!             @ *--sp = fp
10484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     ip, sp                      @ ip<- &fp
10485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- false
10486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #-4]!              @ *--sp = &fp
10487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_method] @ r1<- glue->method
10488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
10489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
10490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r9                      @ r2<- exception
10491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1                 @ r1<- pc - method->insns
10492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #1              @ r1<- offset in code units
10493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call, r0 gets catchRelPc (a code-unit offset) */
10495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
10496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix earlier stack overflow if necessary; may trash rFP */
10498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
10499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
10500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ no, skip ahead
10501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r0                     @ save relPc result in rFP
10502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
105034fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    mov     r1, r9                      @ r1<- exception
10504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCleanupStackOverflow     @ call(self)
10505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP                     @ restore result
10506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
10507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* update frame pointer and check result from dvmFindCatchBlock */
10509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
10510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is catchRelPc < 0?
10511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ restore stack
10512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     .LnotCaughtLocally
10513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* adjust locals to match self->curFrame and updated PC */
10515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
10516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
10517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_method]    @ glue->method = new method
10518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
10519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
10520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
10521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
10522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r2, [rGLUE, #offGlue_methodClassDex] @ glue->pDvmDex = meth...
10523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* release the tracked alloc on the exception */
10525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
10528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* restore the exception if the handler wants it */
10530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
10531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
10533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    streq   r9, [r10, #offThread_exception] @ yes, restore the exception
10534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LnotCaughtLocally: @ r9=exception, r10=self
10537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix stack overflow if necessary */
10538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
10539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
10540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, r10                     @ if yes: r0<- self
105414fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    movne   r1, r9                      @ if yes: r1<- exception
10542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blne    dvmCleanupStackOverflow     @ if yes: call(self)
10543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ may want to show "not caught locally" debug messages here
10545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if DVM_SHOW_EXCEPTION >= 2
10546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call __android_log_print(prio, tag, format, ...) */
10547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* "Exception %s from %s:%d not caught locally" */
10548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmLineNumFromPC(method, pc - method->insns)
10549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
10550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_insns]
10551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1
10552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    asr     r1, r1, #1
10553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLineNumFromPC
10554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
10555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmGetMethodSourceFile(method)
10556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
10557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmGetMethodSourceFile
10558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
10559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ exception->clazz->descriptor
10560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]
10561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_descriptor]
10562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @
10563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, strExceptionNotCaughtLocally
10564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strLogTag
10565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #3                      @ LOG_DEBUG
10566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __android_log_print
10567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
10568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offThread_exception] @ restore exception
10569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
10570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
10571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
10572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
10573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_gotoBail             @ bail out
10574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exception handling, calls through "glue code".
10578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
10580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionOld:
10581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
10582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
10583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_exceptionThrown
10584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
10585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated
10590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values and start executing at the next instruction.
10591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_resumeAfterGlueCall:
10593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FP_FROM_GLUE()              @ pull rPC and rFP out of glue
10594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
10595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
10597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array index.
10600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
10602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayIndexException
10604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
10610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
10612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayStoreException
10614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero.
10620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
10622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArithmeticException
10624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strDivideByZero
10625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
10630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
10632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNegativeArraySizeException
10634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation of a non-existent method.
10640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
10642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNoSuchMethodError
10644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We encountered a null object when we weren't expecting one.  We
10650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * export the PC, throw a NullPointerException, and goto the exception
10651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * processing code.
10652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
10654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
10655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNullPointerException
10656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
10657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
10658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
10659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For debugging, cause an immediate fault.  The source address will
10662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be in lr (use a bl instruction to jump here).
10663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
10665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, .LdeadFood
10666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LdeadFood:
10667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xdeadf00d
10668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out a "we were here", preserving all registers.  (The attempt
10671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to save ip won't work, but we need to save an even number of
10672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers for EABI 64-bit stack alignment.)
10673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .macro  SQUEAK num
10675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_squeak\num:
10676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
10678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #\num
10679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endm
10683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  0
10685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  1
10686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  2
10687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  3
10688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  4
10689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  5
10690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out the number in r0, preserving registers.
10693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNum:
10695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
10697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
10698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a newline, preserving registers.
10704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNewline:
10706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNewline
10708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
10713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
10714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
10715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printHex:
10716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
10718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintHex
10719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 64-bit quantity in r0-r1, preserving registers.
10725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printLong:
10727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r1
10729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0
10730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintLong
10731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
10732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print full method info.  Pass the Method* in r0.  Preserves regs.
10737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printMethod:
10739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpPrintMethod
10741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Call a C helper function that dumps regs and possibly some
10746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional info.  Requires the C function to be compiled in.
10747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
10749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_dumpRegs:
10750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpDumpArmRegs
10752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
10754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
10755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10756d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#if 0
10757d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden/*
10758d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Experiment on VFP mode.
10759d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10760d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * uint32_t setFPSCR(uint32_t val, uint32_t mask)
10761d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10762d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Updates the bits specified by "mask", setting them to the values in "val".
10763d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden */
10764d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddensetFPSCR:
10765d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r0, r0, r1                  @ make sure no stray bits are set
10766d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmrx    r2, fpscr                   @ get VFP reg
10767d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mvn     r1, r1                      @ bit-invert mask
10768d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r2, r2, r1                  @ clear masked bits
10769d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    orr     r2, r2, r0                  @ set specified bits
10770d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmxr    fpscr, r2                   @ set VFP reg
10771d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, r2                      @ return new value
10772d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bx      lr
10773d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10774d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .align  2
10775d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .global dvmConfigureFP
10776d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .type   dvmConfigureFP, %function
10777d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddendvmConfigureFP:
10778d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    stmfd   sp!, {ip, lr}
10779d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x03000000 sets DN/FZ */
10780d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x00009f00 clears the six exception enable flags */
10781d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      common_squeak0
10782d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, #0x03000000             @ r0<- 0x03000000
10783d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
10784d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      setFPSCR
10785d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    ldmfd   sp!, {ip, pc}
10786d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#endif
10787d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references, must be close to the code that uses them.
10791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
10793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArithmeticException:
10794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArithmeticException
10795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayIndexException:
10796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayIndexException
10797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayStoreException:
10798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayStoreException
10799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrDivideByZero:
10800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrDivideByZero
10801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNegativeArraySizeException:
10802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNegativeArraySizeException
10803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNoSuchMethodError:
10804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNoSuchMethodError
10805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNullPointerException:
10806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNullPointerException
10807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrLogTag:
10809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrLogTag
10810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrExceptionNotCaughtLocally:
10811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrExceptionNotCaughtLocally
10812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNewline:
10814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNewline
10815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrSqueak:
10816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrSqueak
10817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintHex:
10818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintHex
10819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintLong:
10820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintLong
10821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
10823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Zero-terminated ASCII string data.
10824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On ARM we have two choices: do like gcc does, and LDR from a .word
10826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the address, or use an ADR pseudo-op to get the address
10827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * directly.  ADR saves 4 bytes and an indirection, but it's using a
10828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PC-relative addressing mode and hence has a limited range, which
10829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it not work well with mergeable string sections.
10830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section .rodata.str1.4,"aMS",%progbits,1
10832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
10834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
10835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
10836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
10837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
10838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
10839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
10840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
10841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
10842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
10843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
10844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
10845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
10846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for objects and 'int'"
10847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
10848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
10849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
10850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
10851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
10852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
10853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
10854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
10855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
10856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NullPointerException;"
10857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrLogTag:
10859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "mterp"
10860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrExceptionNotCaughtLocally:
10861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Exception %s from %s:%d not caught locally\n"
10862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNewline:
10864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "\n"
10865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrSqueak:
10866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%d>"
10867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintHex:
10868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<0x%x>"
10869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintLong:
10870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%lld>"
10871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10873