InterpAsm-armv5te.S revision a80b76553c2b9f33c4063ae8c69c5362d961de81
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
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r7  rIBASE    interpreted instruction base pointer, used for computed goto
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r8  rINST     first 16-bit code unit of current instruction
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
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rIBASE  r7
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rINST   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
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the 32-bit value from a Dalvik register.
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert a virtual register index into an address.
187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden        add     _reg, rFP, _vreg, lsl #2
190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to expand the macros into assembler assignment statements.
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "../common/asm-constants.h"
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/platform.S */
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  CPU-version-specific defines
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDR PC,xxx", which is not allowed pre-ARMv5.  Essentially a
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one-way branch.
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP.  Does not modify LR.
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDR_PC source
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, \source
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "MOV LR,PC / LDR PC,xxx", which is not allowed pre-ARMv5.
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Jump to subroutine.
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * May modify IP and LR.
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.macro  LDR_PC_LR source
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     lr, pc
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, \source
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Macro for "LDMFD SP!, {...regs...,PC}".
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  LDMFD_PC regs
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {\regs,pc}
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.endm
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/entry.S */
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't have formal stack frames, so gdb scans upward in the code
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to find the start of the function (a label with the %function type),
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and then looks at the next few instructions to figure out what
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * got pushed onto the stack.  From this it figures out how to restore
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the registers, including PC, for the previous stack frame.  If gdb
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sees a non-function label, it stops scanning, so either we need to
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have nothing but assembler-local labels between the entry point and
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the break, or we need to fake it out.
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When this is defined, we add some stuff to make gdb less confused.
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ASSIST_DEBUGGER 1
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0  MterpGlue* glue
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This function returns a boolean "changeInterp" value.  The return comes
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * via a call to dvmMterpStdBail().
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY1 \
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .save {r4-r10,fp,lr}; \
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY2 \
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .pad    #4; \
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align 64
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* save stack pointer, add magic word for debuggerd */
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     sp, [r0, #offGlue_bailPtr]  @ save SP for eventual return
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up "named" registers, figure out entry point */
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rGLUE, r0                   @ set rGLUE
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r0, #offGlue_entryPoint]   @ InterpEntry enum is char
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FP_FROM_GLUE()              @ load rPC and rFP from "glue"
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adr     rIBASE, dvmAsmInstructionStart  @ set rIBASE
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryInstr      @ usual case?
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .Lnot_instr                 @ no, handle it
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* start executing the instruction at rPC */
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_instr:
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryReturn     @ were we returning from a method?
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_returnFromMethod
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lnot_return:
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #kInterpEntryThrow      @ were we throwing an exception?
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lbad_arg:
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strBadEntryPoint
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r1 holds value of entryPoint
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAbort
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pushed some registers on the stack in dvmMterpStdRun, then saved
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SP and LR.  Here we restore SP, restore the registers, and then restore
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LR to PC.
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0  MterpGlue* glue
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1  bool changeInterp
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     sp, [r0, #offGlue_bailPtr]      @ sp<- saved SP
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                          @ return the changeInterp value
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4                      @ un-align 64
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDMFD_PC "r4-r10,fp"                    @ restore 9 regs and return
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references.
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrBadEntryPoint:
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrBadEntryPoint
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionStart
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmInstructionStart, %function
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOP.S */
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_inst, %function
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_inst:
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE.S */
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide vA, vB */
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- BBBB
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_16.S */
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- BBBB
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- AAAA
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT.S */
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_16.S */
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-result-wide vAA */
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_EXCEPTION.S */
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-exception vAA */
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offThread_exception]  @ r3<- dvmGetException bypass
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ r1<- 0
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ dvmClearException bypass
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_VOID.S */
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
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_RETURN_WIDE: /* 0x10 */
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_WIDE.S */
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 64-bit value.  Copies the return value into the "glue"
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* return-wide vAA */
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ retval<- r0/r1
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_OBJECT.S */
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a 32-bit value.  Copies the return value into the "glue"
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_4.S */
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/4 vA, #+B */
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r0)                    @ fp[A]<- r1
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_16.S */
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/16 vAA, #+BBBB */
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST.S */
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const vAA, #+BBBBbbbb */
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_HIGH16.S */
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsl #16             @ r0<- BBBB0000
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_16.S */
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_32.S */
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE.S */
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 4)                        @ r3<- HHHH (high)
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #0                      @ r0<- 00000000
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsl #16             @ r1<- BBBB0000
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING.S */
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBB */
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_resolve
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING_JUMBO.S */
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_JUMBO_resolve
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_CLASS.S */
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/class vAA, Class@BBBB */
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_CLASS_resolve
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_ENTER.S */
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Synchronize on an object.
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-enter vAA */
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
84199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         @ need for precise GC, MONITOR_TRACKING
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null object, throw an exception
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLockObject               @ call(self, obj)
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_DEADLOCK_PREDICTION /* implies WITH_MONITOR_TRACKING */
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offThread_exception] @ check for exception
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ exception raised, bail out
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_EXIT.S */
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlock an object.
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction spec.
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-exit vAA */
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ before fetch: export the PC
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, exception is pending
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CHECK_CAST.S */
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* check-cast vAA, class@BBBB */
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- BBBB
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r3)                    @ r9<- object
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_methodClassDex]    @ r0<- pDvmDex
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ is object null?
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved:
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay:
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INSTANCE_OF.S */
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if an object reference is an instance of a class.
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Most common situation is a non-null object, being compared against
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an already-resolved class.
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15                 @ r9<- A
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- pDvmDex
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- CCCC
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ARRAY_LENGTH.S */
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the length of an array.
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yup, fail
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ vB<- length
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_INSTANCE.S */
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new instance of a class.
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-instance vAA, class@BBBB */
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for init, resolve, alloc
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved:   @ r0=class
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized: @ r0=class
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
978b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    bl      dvmAllocObject              @ r0<- new object
979b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    b       .LOP_NEW_INSTANCE_finish          @ continue
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_ARRAY.S */
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- CCCC
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r0)                    @ r1<- vB (array length)
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ check length
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_errNegativeArraySize @ negative length, bail
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for resolve, alloc
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_continue
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC();
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ 0 means an exception is thrown
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ has exception
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_THROW.S */
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception object in the current thread.
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* throw vAA */
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, throw an NPE instead
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ bypass dvmSetException, just store it
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offThread_exception]  @ thread->exception<- obj
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO.S */
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 8-bit offset.
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto +AA */
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asr #24             @ r9<- ssssssAA (sign-extended)
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r9, lsl #1              @ r9<- byte offset
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_16.S */
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 16-bit offset.
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/16 +AAAA */
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- byte offset, check sign
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_32.S */
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 32-bit offset.
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * our "backward branch" test must be "<=0" instead of "<0".  The ORRS
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction doesn't affect the V flag, so we need to clear it
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * explicitly.
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/32 +AAAAAAAA */
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, ip                      @ (clear V flag during stall)
1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    r0, r0, r1, lsl #16         @ r0<- AAAAaaaa, check sign
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0, asl #1              @ r9<- byte offset
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble     common_backwardBranch       @ backward branch, do periodic checks
1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPARSE_SWITCH.S */
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish:
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_FLOAT.S */
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish:
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_DOUBLE.S */
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMP_LONG.S */
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register based on the results of the comparison.
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We load the full values with LDM, but in practice many values could
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be resolved by only looking at the high word.  This could be made
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * faster or slower by splitting the LDM into a pair of LDRs.
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If we just wanted to set condition flags, we could do this:
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subs    ip, r0, r2
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  sbcs    ip, r1, r3
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subeqs  ip, r0, r2
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * integer value, which we can do with 2 conditional mov/mvn instructions
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * us a constant 5-cycle path plus a branch at the end to the
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction epilogue code.  The multi-compare approach below needs
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the worst case (the 64-bit values are equal).
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt     .LOP_CMP_LONG_greater
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r1, r0, r2                  @ r1<- r0 - r2
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CMP_LONG_less
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQ.S */
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NE.S */
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LT.S */
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GE.S */
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GT.S */
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LE.S */
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ yes, do periodic checks
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQZ.S */
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne  1f                      @ branch to 1 if comparison failed
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NEZ.S */
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq  1f                      @ branch to 1 if comparison failed
1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
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_LTZ: /* 0x3a */
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LTZ.S */
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-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-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bge  1f                      @ branch to 1 if comparison failed
1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */
1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GEZ.S */
1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt  1f                      @ branch to 1 if comparison failed
1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GTZ.S */
1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ble  1f                      @ branch to 1 if comparison failed
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LEZ.S */
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt  1f                      @ branch to 1 if comparison failed
1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r9, r9, asl #1              @ convert to bytes, check sign
1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     common_backwardBranch       @ backward branch, do periodic checks
1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3E.S */
1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3F.S */
1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_40.S */
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_41.S */
1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_42.S */
1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
1834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_43.S */
1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */
1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_WIDE.S */
1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aget-wide vAA, vBB, vCC */
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_OBJECT.S */
1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BOOLEAN.S */
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BYTE.S */
1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_CHAR.S */
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_SHORT.S */
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_WIDE.S */
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 64 bits.  vBB[vCC] <- vAA.
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aput-wide vAA, vBB, vCC */
2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_OBJECT.S */
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Store an object into an array.  vBB[vCC] <- vAA.
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vBB (array object)
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null array object?
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r9)                    @ r9<- vAA
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offArrayObject_length]    @ r3<- arrayObj->length
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r1, r0, lsl #2         @ r10<- arrayObj + index*width
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r3                      @ compare unsigned index, length
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BOOLEAN.S */
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BYTE.S */
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_CHAR.S */
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_SHORT.S */
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish          @ no, already resolved
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE.S */
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Wide 32-bit instance field get.
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide vA, vB, field@CCCC */
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish
2329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT.S */
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BOOLEAN.S */
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BYTE.S */
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_CHAR.S */
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_SHORT.S */
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ no, already resolved
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ yes, finish up
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE.S */
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide vA, vB, field@CCCC */
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT.S */
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BOOLEAN.S */
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BYTE.S */
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_CHAR.S */
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_SHORT.S */
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_resolve         @ yes, do resolve
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish: @ field ptr in r0
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_WIDE.S */
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- AA
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r2, [r0, #offStaticField_value] @ r2/r3<- field value (aligned)
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[AA]
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r1, {r2-r3}                 @ vAA/vAA+1<- r2/r3
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_OBJECT.S */
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish: @ field ptr in r0
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BOOLEAN.S */
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BYTE.S */
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish: @ field ptr in r0
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_CHAR.S */
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish: @ field ptr in r0
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_SHORT.S */
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish: @ field ptr in r0
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
2846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_resolve         @ yes, do resolve
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish:   @ field ptr in r0
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_WIDE.S */
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SPUT handler.
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sput-wide vAA, field@BBBB */
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_finish: @ field ptr in r0, AA in r9
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r2, [r0, #offStaticField_value] @ field<- vAA/vAA+1
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_OBJECT.S */
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BOOLEAN.S */
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BYTE.S */
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:   @ field ptr in r0
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_CHAR.S */
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:   @ field ptr in r0
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_SHORT.S */
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange   @ no, continue on
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ yes, continue on
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ no, continue
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_invokeMethodNoRange @ jump to common handler
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_73.S */
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this"?
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ null "this" ref?
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange   @ no, continue on
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ yes, continue on
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_STATIC          @ resolver method type
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ no, continue
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null obj?
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_invokeMethodRange @ jump to common handler
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_79.S */
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_7A.S */
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_INT.S */
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_INT.S */
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
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_NEG_LONG: /* 0x7d */
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_LONG.S */
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_LONG.S */
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                           @ optional op; may set condition codes
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_FLOAT.S */
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_DOUBLE.S */
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_LONG.S */
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_FLOAT.S */
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2f                              @ r0<- op, r0-r3 changed
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_DOUBLE.S */
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2d                              @ r0<- op, r0-r3 changed
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_INT.S */
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_FLOAT.S */
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_INT.S */
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                              @ r0<- op, r0-r3 changed
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unop.S" {"instr":"bl      f2i_doconv"}
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to an int in r0.
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2i_doconv:
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x4f000000             @ (float)maxint
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxint?
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xcf000000             @ (float)minint
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minint?
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                @ convert float to int
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
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_FLOAT_TO_LONG: /* 0x88 */
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_LONG.S */
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2d                              @ r0<- op, r0-r3 changed
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_INT.S */
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                              @ r0<- op, r0-r3 changed
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl      d2i_doconv"}
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0.
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv:
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, .LOP_DOUBLE_TO_INT_maxlo       @ (double)maxint, lo
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, .LOP_DOUBLE_TO_INT_maxhi       @ (double)maxint, hi
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0                      @ save r0
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxint?
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, .LOP_DOUBLE_TO_INT_min         @ (double)minint, hi
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ (double)minint, lo
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minint?
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ return zero for NaN
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                @ convert double to int
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_maxlo:
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xffc00000                  @ maxint, as a double (low word)
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_maxhi:
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0x41dfffff                  @ maxint, as a double (high word)
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_INT_min:
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xc1e00000                  @ minint, as a double (high word)
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_LONG.S */
3893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2f                              @ r0<- op, r0-r3 changed
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_BYTE.S */
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #24                           @ optional op; may set condition codes
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_CHAR.S */
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_SHORT.S */
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #16                              @ 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)                    @ vAA<- r0
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT.S */
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT.S */
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT.S */
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT.S */
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT.S */
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT.S */
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT.S */
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT.S */
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT.S */
4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT.S */
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT.S */
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG.S */
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG.S */
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG.S */
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        WX
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      x YZ
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  --------
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     ZW ZX
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  YW YX
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The low word of the result holds ZX, the high word holds
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * it doesn't fit in the low 64 bits.
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most ARM math operations, multiply instructions have
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * restrictions on using the same register more than once (Rd and Rm
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cannot be the same).
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_MUL_LONG_finish
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG.S */
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG.S */
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG.S */
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG.S */
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG.S */
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG.S */
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_finish
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG.S */
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_finish
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG.S */
4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long vAA, vBB, vCC */
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_finish
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT.S */
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT.S */
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT.S */
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT.S */
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop 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    mov     r3, r0, lsr #8              @ r3<- CC
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT.S */
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE.S */
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE.S */
5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE.S */
5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE.S */
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE.S */
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_2ADDR.S */
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT_2ADDR.S */
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_2ADDR.S */
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_2ADDR.S */
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_2ADDR.S */
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_2ADDR.S */
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_2ADDR.S */
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_2ADDR.S */
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_2ADDR.S */
5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_2ADDR.S */
5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
5779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_2ADDR.S */
5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
5800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
5850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG_2ADDR.S */
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, "/2addr" version.
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_MUL_LONG for an explanation.
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We get a little tight on registers, so to avoid looking up &fp[A]
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again we stuff it into rINST.
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG_2ADDR.S */
5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG_2ADDR.S */
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG_2ADDR.S */
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG_2ADDR.S */
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_2ADDR_finish
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long/2addr vA, vB */
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_2ADDR_finish
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long/2addr vA, vB */
6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_2ADDR_finish
6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */
6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */
6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r9)                    @ r0<- vA
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT16.S */
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT.S */
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT16.S */
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT16.S */
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT16.S */
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT16.S */
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT16.S */
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT16.S */
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT8.S */
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT_LIT8.S */
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT8.S */
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT8.S */
7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT8.S */
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT8.S */
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT8.S */
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT8.S */
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_LIT8.S */
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_LIT8.S */
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
7326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_LIT8.S */
7327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E3: /* 0xe3 */
7365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E3.S */
7366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E4: /* 0xe4 */
7374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E4.S */
7375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E5: /* 0xe5 */
7383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E5.S */
7384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E6: /* 0xe6 */
7392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E6.S */
7393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E7: /* 0xe7 */
7401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E7.S */
7402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E8: /* 0xe8 */
7410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E8.S */
7411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_E9: /* 0xe9 */
7419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_E9.S */
7420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_EA: /* 0xea */
7428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_EA.S */
7429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_EB: /* 0xeb */
7437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_EB.S */
7438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_EC: /* 0xec */
7446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_EC.S */
7447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
74543a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
74553a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
74563a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /*
74573a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * Handle a throw-verification-error instruction.  This throws an
74583a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception for an error discovered during verification.  The
74593a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception is indicated by AA, with some detail provided by BBBB.
74603a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     */
74613a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /* op AA, ref@BBBB */
7462b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
74633a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    FETCH(r2, 1)                        @ r2<- BBBB
7464b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    EXPORT_PC()                         @ export the PC
74653a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     r1, rINST, lsr #8           @ r1<- AA
74663a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    bl      dvmThrowVerificationError   @ always throws
74673a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    b       common_exceptionThrown      @ handle exception
7468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
7473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_EXECUTE_INLINE.S */
7474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
7476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We need to call:
7478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  dvmPerformInlineOp4Std(arg0, arg1, arg2, arg3, &retval, ref)
7479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The first four args are in r0-r3, but the last two must be pushed
7481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * onto the stack.
7482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 1)                       @ r10<- BBBB
7485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ can throw
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #8                  @ make room for arg(s)
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [sp]                    @ push &glue->retval
7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ pop stack
7492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ test boolean result of inline
7493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ returned false, handle exception
7494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_EF: /* 0xef */
7501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_EF.S */
7502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
7510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_EMPTY.S */
7511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invoke-direct-empty is a no-op in a "standard" interpreter.
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
7515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
7517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_F1: /* 0xf1 */
7521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_F1.S */
7522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
7530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide-quick vA, vB, offset@CCCC */
7552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r0, [r3, r1]                @ r0<- obj.field (64 bits, aligned)
7559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
7592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
7594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide-quick vA, vB, offset@CCCC */
7614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A(+)
7615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
7616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
7617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ check object for null
7620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- field byte offset
7623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iput-quick, iput-object-quick */
7635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
7675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is "this" null?
7695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
7696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
7701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
7726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
7728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
7729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
7738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
7740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
7751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r10)                   @ r3<- "this"
7753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ null "this" ref?
7755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
7758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FC: /* 0xfc */
7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FC.S */
7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FD: /* 0xfd */
7773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FD.S */
7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FE: /* 0xfe */
7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FE.S */
7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_FF: /* 0xff */
7791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_FF.S */
7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionEnd
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionEnd:
7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Sister implementations
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterStart
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmSisterStart, %function
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
7811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 4
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterStart:
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING */
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (String ref)
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_resolve:
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
7824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_STRING_JUMBO */
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the String has not yet been resolved.
7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBBBBBB (String ref)
7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_STRING_JUMBO_resolve:
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveString            @ r0<- String reference
7846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
7848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CONST_CLASS */
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the Class has not yet been resolved.
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB (Class ref)
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: target register
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CONST_CLASS_resolve:
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- Class reference
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yup, handle the exception
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
7872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CHECK_CAST */
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_fullcheck:
7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_okay            @ no, success
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ A cast has failed.  We need to throw a ClassCastException with the
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ class of the object that failed to be cast.
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ about to throw
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]  @ r3<- obj->clazz
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .LstrClassCastExceptionPtr
7893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r3, #offClassObject_descriptor] @ r1<- obj->clazz->descriptor
7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowExceptionWithClassMessage
7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds BBBB
7901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolve:
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
7906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- BBBB
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastExceptionPtr:
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrClassCastException
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INSTANCE_OF */
7921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test failed, need to perform full check.  This is common.
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds obj->clazz
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds class resolved from BBBB
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_fullcheck:
7929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_INSTANCE_OF_store
7931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r0 holds boolean result
7934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * r9 holds A
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_store:
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
7939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Trivial test succeeded, save and bail.
7944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
7945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_trivial:
7947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #1                      @ indicate success
7948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
7949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
7951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
7956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r3 holds BBBB
7958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds A
7959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolve:
7961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
7962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r3                      @ r1<- BBBB
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #1                      @ r2<- true
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
7967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
7968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
7969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0                      @ r1<- class resolved from BBB
7970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
7971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
7972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
7973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
7974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_INSTANCE */
7977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 32                          @ minimize cache lines
7979b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden.LOP_NEW_INSTANCE_finish: @ r0=new object
7980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
7981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
7982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
7983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
7986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class initialization required.
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class object
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_needinit:
7994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r0                      @ save r0
7995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInitClass                @ initialize class
7996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ check boolean result
7997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ restore r0
7998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
7999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ failed, deal with init exception
8000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolution required.  This is the least-likely path.
8003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds BBBB
8005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolve:
8007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
8013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
8014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationErrorPtr:
8016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInstantiationError
8017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_NEW_ARRAY */
8020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Resolve class.  (This is an uncommon case.)
8024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r2 holds class ref CCCC
8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_resolve:
8029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ r9<- length (save)
8031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r2                      @ r1<- CCCC
8032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
8035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ r1<- length (restore)
8037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to OP_NEW_ARRAY_finish
8039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Finish allocation.
8042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds class
8044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 holds array length
8045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_ARRAY_finish:
8047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
8048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
8049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
8050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle the exception
8052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ vA<- r0
8056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY */
8060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_continue:
8067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #'I'                    @ array of ints?
8076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'L'                    @ array of objects?
8077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'['                    @ array of arrays?
8078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
8080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
8094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
8119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_notimpl:
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)                 @ define in one or the other, not both
8131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
8139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds array class
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 holds AA or BA
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_continue:
8146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- AA (length)
8151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10, lsr #4             @ r1<- B (length)
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #'I'                    @ array of ints?
8155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'L'                    @ array of objects?
8156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmpne   r3, #'['                    @ array of arrays?
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r1                      @ save length in r9
8158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
8159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null return?
8161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ alloc failed, handle exception
8162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ length--, check for neg
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     2f                          @ was zero, bail
8169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ copy values from registers into the array
8171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     1
8173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r3, [r2], #4                @ r3<- *r2++
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .else
8180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #4                      @ length was initially 5?
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r10, #15                @ r2<- A
8182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f                          @ <= 4 args, branch
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vA
8184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r9, r9, #1                  @ count--
8185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0, #16]               @ contents[4] = vA
8186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r9, r9, #1                  @ count--
8190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r0], #4                @ *contents++ = vX
8191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bpl     1b
8192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ continue at 2
8193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception indicating that we have not implemented this
8201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mode of filled-new-array.
8202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, .L_strInternalError
8205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, .L_strFilledNewArrayNotImpl
8206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
8208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)                 @ define in one or the other, not both
8210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strFilledNewArrayNotImpl:
8211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrFilledNewArrayNotImpl
8212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_strInternalError:
8213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrInternalError
8214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
8215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_FLOAT */
8218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_gt_or_nan:
8223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_FLOAT_finish
8229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_FLOAT_finish
8231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_continue
8250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_continue:
8253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPL_FLOAT_finish
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPL_FLOAT_nan               @ no, must be NaN
8260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_finish:
8264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPL_FLOAT_nan:
8275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPL_FLOAT_finish
8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_FLOAT */
8282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_gt_or_nan:
8287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ reverse order
8288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_FLOAT_finish
8293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_FLOAT_finish
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0       /* "clasic" form */
8298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
8299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
8300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
8301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
8302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
8303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ equal?
8307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0                      @ yes, result is 0
8308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ less than?
8313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_continue
8314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@%break
8315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_continue:
8317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0                      @ yes, result is -1
8318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     OP_CMPG_FLOAT_finish
8319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- vBB
8320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- vCC
8321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ greater than?
8323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     OP_CMPG_FLOAT_nan               @ no, must be NaN
8324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ yes, result is 1
8325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_finish:
8328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
8329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
8331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is expected to be uncommon, so we double-branch (once to here,
8336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again back to _finish).
8337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_CMPG_FLOAT_nan:
8339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       OP_CMPG_FLOAT_finish
8341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
8343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPL_DOUBLE */
8346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_gt_or_nan:
8351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPL_DOUBLE_finish
8357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPL_DOUBLE_finish
8359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMPG_DOUBLE */
8362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Test for NaN with a second comparison.  EABI forbids testing bit
8364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ make the library call.
8366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_gt_or_nan:
8367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r0-r1}                @ reverse order
8368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}
8369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bleq    common_abort
8371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movcc   r1, #1                      @ (greater than) r1<- 1
8372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_CMPG_DOUBLE_finish
8373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMPG_DOUBLE_finish
8375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_CMP_LONG */
8378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_less:
8380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, #0                      @ r1<- -1
8381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Want to cond code the next mov so we can avoid branch, but don't see it;
8382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ instead, we just replicate the tail end.
8383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)                    @ vAA<- r1
8385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_greater:
8389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ r1<- 1
8390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ fall through to _finish
8391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMP_LONG_finish:
8393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)                    @ vAA<- r1
8395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_AGET_WIDE */
8400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_AGET_WIDE_finish:
8402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
8405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
8407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_WIDE */
8411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_WIDE_finish:
8413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
8415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_APUT_OBJECT */
8421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
8423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = vBB (arrayObj)
8424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = vAA (obj)
8425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = offset into array (vBB + vCC * width)
8426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_finish:
8428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ storing null reference?
8429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
8430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offObject_clazz]  @ r1<- arrayObj->clazz
8432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCanPutArrayElement       @ test object type vs. array type
8433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ okay?
8434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errArrayStore        @ no
8435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_APUT_OBJECT_skip_check:
8436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
8439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET */
8443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_finish:
8450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_WIDE */
8464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_WIDE_finish:
8471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
8476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
8479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
8481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_OBJECT */
8485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_OBJECT_finish:
8492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BOOLEAN */
8506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BOOLEAN_finish:
8513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_BYTE */
8527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_BYTE_finish:
8534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
8535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_CHAR */
8548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_CHAR_finish:
8555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
8556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IGET_SHORT */
8569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IGET_SHORT_finish:
8576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
8577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
8586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT */
8590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_finish:
8597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_WIDE */
8611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_WIDE_finish:
8618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
8619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
8621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
8623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
8626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0
8628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_OBJECT */
8632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_OBJECT_finish:
8639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak0
8640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BOOLEAN */
8653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BOOLEAN_finish:
8660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak1
8661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_BYTE */
8674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_BYTE_finish:
8681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak2
8682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_CHAR */
8695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_CHAR_finish:
8702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak3
8703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_IPUT_SHORT */
8716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Currently:
8719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 holds resolved field
8720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 holds object
8721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_IPUT_SHORT_finish:
8723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_squeak4
8724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #8           @ r1<- A+
8725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #15                 @ r1<- A
8727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ check object for null
8728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- fp[A]
8729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
8730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET */
8737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_resolve:
8743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_finish          @ yes, finish
8749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_WIDE */
8753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_resolve:
8759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_WIDE_finish          @ yes, finish
8765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_OBJECT */
8769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_resolve:
8775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_OBJECT_finish          @ yes, finish
8781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BOOLEAN */
8785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_resolve:
8791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_BOOLEAN_finish          @ yes, finish
8797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_BYTE */
8801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_resolve:
8807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_BYTE_finish          @ yes, finish
8813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_CHAR */
8817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_resolve:
8823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_CHAR_finish          @ yes, finish
8829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SGET_SHORT */
8833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_resolve:
8839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SGET_SHORT_finish          @ yes, finish
8845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT */
8849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_resolve:
8855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_finish          @ yes, finish
8861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_WIDE */
8865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9: &fp[AA]
8870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_WIDE_resolve:
8872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_WIDE_finish          @ yes, finish
8878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_OBJECT */
8882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_OBJECT_resolve:
8888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_OBJECT_finish          @ yes, finish
8894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BOOLEAN */
8898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_resolve:
8904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BOOLEAN_finish          @ yes, finish
8910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_BYTE */
8914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_resolve:
8920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_BYTE_finish          @ yes, finish
8926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_CHAR */
8930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_resolve:
8936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_CHAR_finish          @ yes, finish
8942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SPUT_SHORT */
8946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Continuation if the field has not yet been resolved.
8949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1: BBBB field ref
8950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_resolve:
8952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw, so export now
8954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
8957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_SPUT_SHORT_finish          @ yes, finish
8958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ no, handle exception
8959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL */
8962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
8965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
8966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
8967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_continue:
8969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r10)                   @ r1<- "this" ptr
8970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
8971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is "this" null?
8972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
8973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
8974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
8975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
8976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
8977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER */
8980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
8983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
8984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
8985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_continue:
8987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
8988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
8989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
8990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
8991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
8992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
8993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
8994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
8995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodNoRange @ continue on
8996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_resolve:
8998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
8999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
9003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_nsm:
9010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT */
9015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_resolve:
9022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
9029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_VIRTUAL_RANGE */
9033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_VIRTUAL_RANGE_continue:
9040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r10)                   @ r1<- "this" ptr
9041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is "this" null?
9043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
9044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
9045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
9048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_SUPER_RANGE */
9051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * At this point:
9054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 = method->clazz
9056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_continue:
9058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
9059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
9062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
9064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_invokeMethodRange @ continue on
9067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_resolve:
9069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- method->clazz
9070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
9074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw a NoSuchMethodError with the method name as the message.
9078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = resolved base method
9079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_SUPER_RANGE_nsm:
9081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNoSuchMethod
9083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_INVOKE_DIRECT_RANGE */
9086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r1 = reference (BBBB or CCCC)
9090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = "this" register
9091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_resolve:
9093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
9094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_DIRECT          @ resolver method type
9096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
9098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
9099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
9100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
9101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_FLOAT_TO_LONG */
9104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to a long in r0/r1.
9106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2l_doconv:
9112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
9113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x5f000000             @ (float)maxlong
9114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
9115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxlong?
9116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffff)
9118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xdf000000             @ (float)minlong
9123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minlong?
9124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (80000000)
9126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
9128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
9131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
9132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}
9135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2lz                @ convert float to long
9138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
9139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_DOUBLE_TO_LONG */
9142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to a long in r0/r1.
9144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to long min/max per the specification.  The
9146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
9147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
9148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2l_doconv:
9150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
9151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, .LOP_DOUBLE_TO_LONG_max         @ (double)maxlong, hi
9152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
9153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ (double)maxlong, lo
9154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0                      @ save r0
9155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
9156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxlong?
9157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
9159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r1, #0x80000000
9160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, .LOP_DOUBLE_TO_LONG_min         @ (double)minlong, hi
9165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ (double)minlong, lo
9166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minlong?
9167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
9168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0                      @ return minlong (8000000000000000)
9169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r1, #0x80000000
9170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
9171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
9175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
9176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
9177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
9178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ return zero for NaN
9179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f
9180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
9182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
9183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2lz                @ convert double to long
9184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
9186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
9187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
9188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_max:
9190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0x43e00000                  @ maxlong, as a double (high word)
9191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_DOUBLE_TO_LONG_min:
9192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xc3e00000                  @ minlong, as a double (high word)
9193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_MUL_LONG */
9196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_MUL_LONG_finish:
9198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
9200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG */
9204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_finish:
9206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
9207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG */
9213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_finish:
9215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
9216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG */
9222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_finish:
9224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
9225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHL_LONG_2ADDR */
9231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHL_LONG_2ADDR_finish:
9233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_SHR_LONG_2ADDR */
9239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SHR_LONG_2ADDR_finish:
9241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_USHR_LONG_2ADDR */
9247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_USHR_LONG_2ADDR_finish:
9249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* continuation for OP_EXECUTE_INLINE */
9255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Extract args, call function.
9258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 = #of args (0-4)
9259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r10 = call index
9260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
9262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Other ideas:
9263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Use a jump table from the main piece to jump directly into the
9264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   AND/LDR pairs.  Costs a data load, saves a branch.
9265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * - Have five separate pieces that do the loading, so we can work the
9266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   interleave a little better.  Increases code size.
9267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_continue:
9269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #4                  @ r0<- 4-r0
9270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r9, 2)                        @ r9<- FEDC
9271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
9273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r9, #0xf000             @ isolate F
9274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
9275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r9, #0x0f00             @ isolate E
9276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
9277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r9, #0x00f0             @ isolate D
9278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
9279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r9, #0x000f             @ isolate C
9280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
9281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:
9282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, .LOP_EXECUTE_INLINE_table       @ table of InlineOperation
9283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (not reached)
9285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_EXECUTE_INLINE_table:
9287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   gDvmInlineOpsTable
9288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
9291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmSisterEnd
9292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmSisterEnd:
9293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/footer.S */
9295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Common subroutines and data
9298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
9299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
9302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
9303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code when a backward branch is taken.
9306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
9308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is PC adjustment *in bytes*
9309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_backwardBranch:
9311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryInstr
9312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
9313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
9314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Need to see if the thread needs to be suspended or debugger/profiler
9320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * activity has begun.
9321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: if JDWP isn't running, zero out pDebuggerActive pointer so we don't
9323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have to do the second ldr.
9324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: reduce this so we're just checking a single location.
9326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
9328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is reentry type, e.g. kInterpEntryInstr
9329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r9 is trampoline PC adjustment *in bytes*
9330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_periodicChecks:
9332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_pSelfSuspendCount] @ r3<- &suspendCount
9333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
9335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_pDebuggerActive]   @ r1<- &debuggerActive
9336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_PROFILER)
9338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rGLUE, #offGlue_pActiveProfilers]  @ r2<- &activeProfilers
9339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3]                    @ r3<- suspendCount (int)
9342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER)
9344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r1]                    @ r1<- debuggerActive (boolean)
9345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined (WITH_PROFILER)
9347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
9348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ suspend pending?
935199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    bne     2f                          @ yes, do full suspension check
9352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
9354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
9355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    r1, r1, r2                  @ r1<- r1 | r2
9356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ debugger attached or profiler started?
9357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# elif defined(WITH_DEBUGGER)
9358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ debugger attached?
9359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# elif defined(WITH_PROFILER)
9360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ profiler started?
9361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# endif
9362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     3f                          @ debugger/profiler, switch interp
9363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr                          @ nothing to do, return
9366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  @ check suspend
9368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
936999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    EXPORT_PC()                         @ need for precise GC
9370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       dvmCheckSuspendPending      @ suspend if necessary, then return
9371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  @ debugger/profiler enabled, bail out
9373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, rPC, r9                @ update rPC
9374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_entryPoint]
9375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #1                      @ "want switch" = true
9376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_gotoBail
9377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The equivalent of "goto bail", this calls through the "bail handler".
9381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * State registers will be saved to the "glue" area before bailing.
9383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
9385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r1 is "bool changeInterp", indicating if we want to switch to the
9386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     other interpreter or just bail all the way out
9387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
9389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
9390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ r0<- glue ptr
9391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       dvmMterpStdBail             @ call(glue, changeInterp)
9392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r1, r1, #1                  @ using (boolean+1)
9394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @add     r0, rGLUE, #offGlue_jmpBuf  @ r0<- &glue->jmpBuf
9395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      _longjmp                    @ does not return
9396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @bl      common_abort
9397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation with range.
9401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
9403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
9404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodRange:
9406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewRange:
9407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
9408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
9409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
9410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LinvokeArgsDone            @ if no args, skip the rest
9411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- CCCC
9412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
9414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (very few methods have > 10 args; could unroll for common cases)
9415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
9416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
9417642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
9418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r1, [r3], #4                @ val = *fp++
9419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r2, r2, #1                  @ count--
9420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r10], #4               @ *outs++ = val
9421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1b                          @ ...while count != 0
9422642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r3, [r0, #offMethod_outsSize]   @ r3<- methodToCall->outsSize
9423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LinvokeArgsDone
9424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation without range.
9427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
9429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  r0 is "Method* methodToCall", the method we're trying to call
9430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodNoRange:
9432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewNoRange:
9433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
9434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
9435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
9436642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
9437642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
9438642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
9439642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    beq     .LinvokeArgsDone
9440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9441642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    @ r0=methodToCall, r1=GFED, r3=outSize, r2=count, r9=regSize, r10=outs
9442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNonRange:
9443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r2, r2, #5                  @ r2<- 5-r2
9444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
9445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
9446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project5:  and     ip, rINST, #0x0f00          @ isolate A
9447642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
9448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
9449642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vA
9450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r1, #0xf000             @ isolate G
9451642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
9452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
9453642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vG
9454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r1, #0x0f00             @ isolate F
9455642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
9456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
9457642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vF
9458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r1, #0x00f0             @ isolate E
9459642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
9460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
9461642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vE
9462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r1, #0x000f             @ isolate D
9463642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
9464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
9465642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vD
9466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  @ fall through to .LinvokeArgsDone
9467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9468642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng.LinvokeArgsDone: @ r0=methodToCall, r3=outSize, r9=regSize
9469642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
9470642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
9471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ find space for the new stack frame, check for overflow
9472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
9473642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
9474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
9475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@    bl      common_dumpRegs
9476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
9477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
9478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, r9                      @ bottom < interpStackEnd?
9479642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
9480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt     .LstackOverflow             @ yes, this frame will overflow stack
9481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ set up newSaveArea
9483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB
9484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
9485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [r10, #offStackSaveArea_prevSave]
9486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r10, #offStackSaveArea_prevFrame]
9488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rPC, [r10, #offStackSaveArea_savedPc]
9489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r10, #offStackSaveArea_method]
9490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    tst     r3, #ACC_NATIVE
9491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LinvokeNative
9492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
9495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
9496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP
9497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
9498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
9499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
9500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
9501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1
9502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
9503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
9504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
9505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
9506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
9507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9508642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
9509642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
9510642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r2                         @ publish new rPC
9511642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
9512642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
9513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Update "glue" values for the new method
9514642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    @ r0=methodToCall, r1=newFp, r2=self, r3=newMethodClass, r9=newINST
9515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
9516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
9517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r1                         @ fp = newFp
9518642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
9519642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rINST, r9                       @ publish new rINST
9520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
9521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                         @ jump to next instruction
9522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNative:
9524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Prep for the native call
9525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=newFp, r10=newSaveArea
9526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
9527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r3, #offThread_jniLocal_nextEntry] @ r9<- thread->refNext
9528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
9529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offStackSaveArea_localRefTop] @newFp->localRefTop=refNext
9530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, r3                      @ r9<- glue->self (preserve)
9531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ r2<- methodToCall
9533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                      @ r0<- newFp (points to args)
9534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
9535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
9537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
9538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .Lskip
9539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_mterp, %function
9540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_mterp:
9541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
9542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
9543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
9544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lskip:
9545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @mov     lr, pc                      @ set return addr
9548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
9549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LDR_PC_LR "[r2, #offMethod_nativeFunc]"
9550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ native return; r9=self, r10=newSaveArea
9552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ equivalent to dvmPopJniLocals
9553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r10, #offStackSaveArea_localRefTop] @ r0<- newSave->localRefTop
9554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r9, #offThread_exception] @ check for exception
9555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
9556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null?
9557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r9, #offThread_jniLocal_nextEntry] @ self->refNext<- r0
9558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ no, handle exception
9559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
9561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstackOverflow:
9565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- self
9566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmHandleStackOverflow
9567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
9568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
9569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
9570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Common code for method invocation, calling through "glue code".
9575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
9576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TODO: now that we have range and non-range invoke handlers, this
9577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       needs to be split into two.  Maybe just create entry points
9578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       that set r9 and jump here?
9579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
9580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
9581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 is "Method* methodToCall", the method we're trying to call
9582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 is "bool methodCallRange", indicating if this is a /range variant
9583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
9585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeOld:
9586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #8                  @ space for args + pad
9587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
9588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ A2<- methodToCall
9589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ A0<- glue
9590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
9591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ A1<- methodCallRange
9592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ A3<- AA
9593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #0]                @ A4<- ip
9594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
9595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ remove arg area
9596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall  @ continue to next instruction
9597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
9598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction.
9603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
9605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
9607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnNew:
9608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryReturn
9609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
9610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
9611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
9613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
9614642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
9615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
9616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        @ r2<- method we're returning to
9617642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
9618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is this a break frame?
9619642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
9620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
9621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_gotoBail             @ break frame, bail out completely
9622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9623642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
9624642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
9625642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
9626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r3, #offThread_curFrame]  @ self->curFrame = fp
9627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9628642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r9                     @ publish new rPC
9629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_methodClassDex]
9630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return handling, calls through "glue code".
9634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
9636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnOld:
9637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
9638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
9639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_returnFromMethod
9640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
9641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
9642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
9646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
9648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
9649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
9650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
9652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
9654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionNew:
9655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #kInterpEntryThrow
9656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, #0
9657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_periodicChecks
9658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r10, [rGLUE, #offGlue_self] @ r10<- glue->self
9660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r9, [r10, #offThread_exception] @ r9<- self->exception
9661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
9662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
9663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
9664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- NULL
9665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r3, [r10, #offThread_exception] @ self->exception = NULL
9666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up args and a local for "&fp" */
9668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
9669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [sp, #-4]!             @ *--sp = fp
9670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     ip, sp                      @ ip<- &fp
9671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- false
9672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #-4]!              @ *--sp = &fp
9673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [rGLUE, #offGlue_method] @ r1<- glue->method
9674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
9675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
9676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r9                      @ r2<- exception
9677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1                 @ r1<- pc - method->insns
9678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #1              @ r1<- offset in code units
9679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call, r0 gets catchRelPc (a code-unit offset) */
9681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
9682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix earlier stack overflow if necessary; may trash rFP */
9684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
9685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
9686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ no, skip ahead
9687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r0                     @ save relPc result in rFP
9688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r10                     @ r0<- self
9689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCleanupStackOverflow     @ call(self)
9690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP                     @ restore result
9691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
9692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* update frame pointer and check result from dvmFindCatchBlock */
9694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
9695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is catchRelPc < 0?
9696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ restore stack
9697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     .LnotCaughtLocally
9698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* adjust locals to match self->curFrame and updated PC */
9700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
9701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
9702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [rGLUE, #offGlue_method]    @ glue->method = new method
9703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
9704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
9705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
9706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
9707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r2, [rGLUE, #offGlue_methodClassDex] @ glue->pDvmDex = meth...
9708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* release the tracked alloc on the exception */
9710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
9711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
9712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
9713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* restore the exception if the handler wants it */
9715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
9716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
9718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    streq   r9, [r10, #offThread_exception] @ yes, restore the exception
9719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LnotCaughtLocally: @ r9=exception, r10=self
9722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix stack overflow if necessary */
9723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r10, #offThread_stackOverflowed]
9724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
9725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, r10                     @ if yes: r0<- self
9726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blne    dvmCleanupStackOverflow     @ if yes: call(self)
9727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ may want to show "not caught locally" debug messages here
9729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if DVM_SHOW_EXCEPTION >= 2
9730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call __android_log_print(prio, tag, format, ...) */
9731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* "Exception %s from %s:%d not caught locally" */
9732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmLineNumFromPC(method, pc - method->insns)
9733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
9734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_insns]
9735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1
9736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    asr     r1, r1, #1
9737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLineNumFromPC
9738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
9739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmGetMethodSourceFile(method)
9740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [rGLUE, #offGlue_method]
9741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmGetMethodSourceFile
9742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
9743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ exception->clazz->descriptor
9744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]
9745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_descriptor]
9746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @
9747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, strExceptionNotCaughtLocally
9748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strLogTag
9749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #3                      @ LOG_DEBUG
9750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __android_log_print
9751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
9752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r9, [r10, #offThread_exception] @ restore exception
9753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
9754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10                     @ r1<- self
9755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
9756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ "want switch" = false
9757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_gotoBail             @ bail out
9758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exception handling, calls through "glue code".
9762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
9764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionOld:
9765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVE_PC_FP_TO_GLUE()                @ export state
9766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rGLUE                   @ arg to function
9767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_exceptionThrown
9768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
9769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
9770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated
9774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values and start executing at the next instruction.
9775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_resumeAfterGlueCall:
9777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOAD_PC_FP_FROM_GLUE()              @ pull rPC and rFP out of glue
9778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
9779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
9781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array index.
9784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
9786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayIndexException
9788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
9789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
9790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
9791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invalid array value.
9794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayStore:
9796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArrayStoreException
9798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
9799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
9800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
9801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero.
9804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
9806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strArithmeticException
9808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strDivideByZero
9809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
9810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
9811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
9814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
9816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNegativeArraySizeException
9818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
9819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
9820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
9821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation of a non-existent method.
9824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
9826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNoSuchMethodError
9828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
9829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
9830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
9831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We encountered a null object when we weren't expecting one.  We
9834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * export the PC, throw a NullPointerException, and goto the exception
9835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * processing code.
9836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
9838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
9839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNullPointerException
9840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
9841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmThrowException
9842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
9843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For debugging, cause an immediate fault.  The source address will
9846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be in lr (use a bl instruction to jump here).
9847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
9849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, .LdeadFood
9850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LdeadFood:
9851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xdeadf00d
9852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out a "we were here", preserving all registers.  (The attempt
9855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to save ip won't work, but we need to save an even number of
9856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers for EABI 64-bit stack alignment.)
9857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .macro  SQUEAK num
9859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_squeak\num:
9860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
9861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
9862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #\num
9863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
9864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
9865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
9866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endm
9867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  0
9869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  1
9870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  2
9871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  3
9872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  4
9873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  5
9874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out the number in r0, preserving registers.
9877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNum:
9879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
9880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
9881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
9882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
9883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
9884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
9885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a newline, preserving registers.
9888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNewline:
9890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
9891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNewline
9892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
9893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
9894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
9895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
9897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
9898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
9899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printHex:
9900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
9901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
9902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintHex
9903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
9904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
9905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
9906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 64-bit quantity in r0-r1, preserving registers.
9909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printLong:
9911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
9912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r1
9913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0
9914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintLong
9915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
9916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
9917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
9918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print full method info.  Pass the Method* in r0.  Preserves regs.
9921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printMethod:
9923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
9924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpPrintMethod
9925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
9926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
9927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Call a C helper function that dumps regs and possibly some
9930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional info.  Requires the C function to be compiled in.
9931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
9933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_dumpRegs:
9934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
9935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpDumpArmRegs
9936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
9937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
9938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
9939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * String references, must be close to the code that uses them.
9943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
9945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArithmeticException:
9946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArithmeticException
9947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayIndexException:
9948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayIndexException
9949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrArrayStoreException:
9950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrArrayStoreException
9951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrDivideByZero:
9952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrDivideByZero
9953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNegativeArraySizeException:
9954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNegativeArraySizeException
9955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNoSuchMethodError:
9956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNoSuchMethodError
9957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNullPointerException:
9958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNullPointerException
9959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrLogTag:
9961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrLogTag
9962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrExceptionNotCaughtLocally:
9963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrExceptionNotCaughtLocally
9964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrNewline:
9966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrNewline
9967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrSqueak:
9968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrSqueak
9969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintHex:
9970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintHex
9971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectstrPrintLong:
9972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   .LstrPrintLong
9973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Zero-terminated ASCII string data.
9976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On ARM we have two choices: do like gcc does, and LDR from a .word
9978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the address, or use an ADR pseudo-op to get the address
9979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * directly.  ADR saves 4 bytes and an indirection, but it's using a
9980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PC-relative addressing mode and hence has a limited range, which
9981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it not work well with mergeable string sections.
9982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
9983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section .rodata.str1.4,"aMS",%progbits,1
9984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
9986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
9987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArithmeticException:
9988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArithmeticException;"
9989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayIndexException:
9990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
9991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrArrayStoreException:
9992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ArrayStoreException;"
9993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrClassCastException:
9994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/ClassCastException;"
9995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrDivideByZero:
9996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "divide by zero"
9997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
9998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for objects and 'int'"
9999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInternalError:
10000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InternalError;"
10001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrInstantiationError:
10002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/InstantiationError;"
10003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNegativeArraySizeException:
10004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NegativeArraySizeException;"
10005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNoSuchMethodError:
10006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NoSuchMethodError;"
10007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNullPointerException:
10008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Ljava/lang/NullPointerException;"
10009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrLogTag:
10011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "mterp"
10012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrExceptionNotCaughtLocally:
10013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Exception %s from %s:%d not caught locally\n"
10014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNewline:
10016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "\n"
10017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrSqueak:
10018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%d>"
10019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintHex:
10020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<0x%x>"
10021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintLong:
10022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%lld>"
10023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10025