InterpAsm-armv5te-vfp.S revision 7a44e4ee0782d24b4c6090be1f0a3c66f971f2c1
1a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
2a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * This file was generated automatically by gen-mterp.py for 'armv5te-vfp'.
3a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
4a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * --> DO NOT EDIT <--
5a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
6a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/header.S */
8a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Copyright (C) 2008 The Android Open Source Project
10a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
11a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
12a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * you may not use this file except in compliance with the License.
13a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * You may obtain a copy of the License at
14a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
15a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
16a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
17a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Unless required by applicable law or agreed to in writing, software
18a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
19a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * See the License for the specific language governing permissions and
21a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * limitations under the License.
22a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
23a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
24a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * ARMv5 definitions and declarations.
25a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
26a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
27a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
28a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenARM EABI general notes:
29a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
30a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr0-r3 hold first 4 args to a method; they are not preserved across method calls
31a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr4-r8 are available for general use
32a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr9 is given special treatment in some situations, but not for us
33a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr10 (sl) seems to be generally available
34a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
35a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr12 (ip) is scratch -- not preserved across method calls
36a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr13 (sp) should be managed carefully in case a signal arrives
37a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr14 (lr) must be preserved
38a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr15 (pc) can be tinkered with directly
39a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
40a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr0 holds returns of <= 4 bytes
41a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenr0-r1 hold returns of 8 bytes, low word in r0
42a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
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.
46a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
47a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenStack is "full descending".  Only the arguments that don't fit in the first 4
48a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenregisters are placed on the stack.  "sp" points at the first stacked argument
49a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden(i.e. the 5th arg).
50a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
51a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenVFP: single-precision results in s0, double-precision results in d0.
52a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
53a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenIn the EABI, "sp" must be 64-bit aligned on entry to a function, and any
54a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden64-bit quantities (long long, double) must be 64-bit aligned.
55a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden*/
56a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
57a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
58a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenMterp and ARM notes:
59a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
60a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenThe following registers have fixed assignments:
61a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
62a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden  reg nick      purpose
63a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden  r4  rPC       interpreted program counter, used for fetching instructions
64a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden  r5  rFP       interpreted frame pointer, used for accessing locals and args
65a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden  r6  rGLUE     MterpGlue pointer
661da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r7  rINST     first 16-bit code unit of current instruction
671da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r8  rIBASE    interpreted instruction base pointer, used for computed goto
68a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
69a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenMacros are provided for common operations.  Each macro MUST emit only
70a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenone instruction to make instruction-counting easier.  They MUST NOT alter
71a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenunspecified registers or condition codes.
72a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden*/
73a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
74a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* single-purpose registers, given names for clarity */
75a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define rPC     r4
76a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define rFP     r5
77a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define rGLUE   r6
781da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rINST   r7
791da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rIBASE  r8
80a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
81a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* save/restore the PC and/or FP from the glue struct */
82a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define LOAD_PC_FROM_GLUE()     ldr     rPC, [rGLUE, #offGlue_pc]
83a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define SAVE_PC_TO_GLUE()       str     rPC, [rGLUE, #offGlue_pc]
84a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define LOAD_FP_FROM_GLUE()     ldr     rFP, [rGLUE, #offGlue_fp]
85a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define SAVE_FP_TO_GLUE()       str     rFP, [rGLUE, #offGlue_fp]
86a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define LOAD_PC_FP_FROM_GLUE()  ldmia   rGLUE, {rPC, rFP}
87a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define SAVE_PC_FP_TO_GLUE()    stmia   rGLUE, {rPC, rFP}
88a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
89a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
90a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * "export" the PC to the stack frame, f/b/o future exception objects.  Must
91a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * be done *before* something calls dvmThrowException.
92a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
93a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
94a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
95a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
96a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * It's okay to do this more than once.
97a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
98a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define EXPORT_PC() \
99a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Given a frame pointer, find the stack save area.
103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * In C this is "((StackSaveArea*)(_fp) -1)".
105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define SAVEAREA_FROM_FP(_reg, _fpreg) \
107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     _reg, _fpreg, #sizeofStackSaveArea
108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define FETCH_INST()            ldrh    rINST, [rPC]
113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Fetch the next instruction from the specified offset.  Advances rPC
116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * to point to the next instruction.  "_count" is in 16-bit code units.
117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Because of the limited size of immediate constants on ARM, this is only
119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * suitable for small forward movements (i.e. don't try to implement "goto"
120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * with this).
121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * This must come AFTER anything that can throw an exception, or the
123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * exception catch may miss.  (This also implies that it must come after
124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * EXPORT_PC().)
125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #(_count*2)]!
127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * The operation performed here is similar to FETCH_ADVANCE_INST, except the
130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * src and dest registers are parameterized (not hard-wired to rPC and rINST).
131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden        ldrh    _dreg, [_sreg, #(_count*2)]!
134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Fetch the next instruction from an offset specified by _reg.  Updates
137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * rPC to point to the next instruction.  "_reg" must specify the distance
138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * in bytes, *not* 16-bit code units, and may be a signed value.
139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * We want to write "ldrh rINST, [rPC, _reg, lsl #2]!", but some of the
141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * bits that hold the shift distance are used for the half/byte/sign flags.
142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * In some cases we can pre-double _reg for free, so we require a byte offset
143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * here.
144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Fetch a half-word code unit from an offset past the current PC.  The
149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * "_count" value is in 16-bit code units.  Does not advance rPC.
150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * The "_S" variant works the same but treats the value as signed.
152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #(_count*2)]
154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #(_count*2)]
155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Fetch one byte from an offset past the current PC.  Pass in the same
158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * "_count" as you would for FETCH, and an additional 0/1 indicating which
159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * byte of the halfword you want (lo/hi).
160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #(_count*2+_byte)]
162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Put the instruction's opcode field into the specified register.
165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Put the prefetched instruction's opcode field into the specified register.
170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Begin executing the opcode in _reg.  Because this only jumps within the
175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Get/set the 32-bit value from a Dalvik register.
183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GET_JIT_PROF_TABLE(_reg)    ldr     _reg,[rGLUE,#offGlue_pJitProfTable]
189d726991ba52466cde88e37aba4de2395b62477faBill Buzbee#define GET_JIT_THRESHOLD(_reg)     ldr     _reg,[rGLUE,#offGlue_jitThreshold]
190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert a virtual register index into an address.
194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden        add     _reg, rFP, _vreg, lsl #2
197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * This is a #include, not a %include, because we want the C pre-processor
200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * to expand the macros into assembler assignment statements.
201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#include "../common/asm-constants.h"
203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2047b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#if defined(WITH_JIT)
2057b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#include "../common/jit-config.h"
2067b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#endif
207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/platform.S */
209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * ===========================================================================
211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  CPU-version-specific defines
212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * ===========================================================================
213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Macro for "LDR PC,xxx", which is not allowed pre-ARMv5.  Essentially a
217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * one-way branch.
218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * May modify IP.  Does not modify LR.
220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.macro  LDR_PC source
222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     pc, \source
223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.endm
224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Macro for "MOV LR,PC / LDR PC,xxx", which is not allowed pre-ARMv5.
227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Jump to subroutine.
228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * May modify IP and LR.
230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.macro  LDR_PC_LR source
232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     lr, pc
233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     pc, \source
234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.endm
235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Macro for "LDMFD SP!, {...regs...,PC}".
238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * May modify IP and LR.
240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.macro  LDMFD_PC regs
242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {\regs,pc}
243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.endm
244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/entry.S */
247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Copyright (C) 2008 The Android Open Source Project
249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * you may not use this file except in compliance with the License.
252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * You may obtain a copy of the License at
253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Unless required by applicable law or agreed to in writing, software
257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * See the License for the specific language governing permissions and
260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * limitations under the License.
261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Interpreter entry point.
264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * We don't have formal stack frames, so gdb scans upward in the code
268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * to find the start of the function (a label with the %function type),
269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * and then looks at the next few instructions to figure out what
270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * got pushed onto the stack.  From this it figures out how to restore
271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * the registers, including PC, for the previous stack frame.  If gdb
272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * sees a non-function label, it stops scanning, so either we need to
273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * have nothing but assembler-local labels between the entry point and
274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * the break, or we need to fake it out.
275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * When this is defined, we add some stuff to make gdb less confused.
277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define ASSIST_DEBUGGER 1
279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .text
281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .align  2
282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .global dvmMterpStdRun
283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .type   dvmMterpStdRun, %function
284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On entry:
287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r0  MterpGlue* glue
288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * This function returns a boolean "changeInterp" value.  The return comes
290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * via a call to dvmMterpStdBail().
291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendvmMterpStdRun:
293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define MTERP_ENTRY1 \
294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .save {r4-r10,fp,lr}; \
295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define MTERP_ENTRY2 \
297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .pad    #4; \
298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     sp, sp, #4                  @ align 64
299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .fnstart
301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    MTERP_ENTRY1
302a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    MTERP_ENTRY2
303a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* save stack pointer, add magic word for debuggerd */
305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     sp, [r0, #offGlue_bailPtr]  @ save SP for eventual return
306a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
307a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* set up "named" registers, figure out entry point */
308a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     rGLUE, r0                   @ set rGLUE
30951ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee    ldr     r1, [r0, #offGlue_entryPoint]   @ enum is 4 bytes in aapcs-EABI
310a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    LOAD_PC_FP_FROM_GLUE()              @ load rPC and rFP from "glue"
311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    adr     rIBASE, dvmAsmInstructionStart  @ set rIBASE
312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #kInterpEntryInstr      @ usual case?
313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .Lnot_instr                 @ no, handle it
314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
315ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
316d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng.LentryInstr:
3177a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
318ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Entry is always a possible trace start */
319ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
320ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
3217a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov    r1, #0                       @ prepare the value for the new state
3227a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r1, [r10, #offThread_inJitCodeCache] @ back to the interp land
323ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
324ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne    common_updateProfile
325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
326ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
327ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* start executing the instruction at rPC */
329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_INST()                        @ load rINST from rPC
330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
332ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
333a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.Lnot_instr:
335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #kInterpEntryReturn     @ were we returning from a method?
336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_returnFromMethod
337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.Lnot_return:
339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #kInterpEntryThrow      @ were we throwing an exception?
340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown
341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
342ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
343ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.Lnot_throw:
344d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r10,[rGLUE, #offGlue_jitResumeNPC]
345d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r2,[rGLUE, #offGlue_jitResumeDPC]
346ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #kInterpEntryResume     @ resuming after Jit single-step?
347ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .Lbad_arg
348ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     rPC,r2
349d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bne     .LentryInstr                @ must have branched, don't resume
350d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#if defined(WITH_SELF_VERIFICATION)
351d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    @ glue->entryPoint will be set in dvmSelfVerificationSaveState
352d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b       jitSVShadowRunStart         @ re-enter the translation after the
353d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng                                        @ single-stepped instruction
354d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    @noreturn
355d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng#endif
356ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, #kInterpEntryInstr
35751ae442fa9ed49e081e58e5127d1805789dbb196Bill Buzbee    str     r1, [rGLUE, #offGlue_entryPoint]
358d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bx      r10                         @ re-enter the translation
359ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
360ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.Lbad_arg:
362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strBadEntryPoint
363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ r1 holds value of entryPoint
364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      printf
365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmAbort
366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .fnend
367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .global dvmMterpStdBail
370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .type   dvmMterpStdBail, %function
371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Restore the stack pointer and PC from the save point established on entry.
374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * This is essentially the same as a longjmp, but should be cheaper.  The
375a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * last instruction causes us to return to whoever called dvmMterpStdRun.
376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * We pushed some registers on the stack in dvmMterpStdRun, then saved
378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * SP and LR.  Here we restore SP, restore the registers, and then restore
379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * LR to PC.
380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On entry:
382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r0  MterpGlue* glue
383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r1  bool changeInterp
384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendvmMterpStdBail:
386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     sp, [r0, #offGlue_bailPtr]      @ sp<- saved SP
387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r1                          @ return the changeInterp value
388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     sp, sp, #4                      @ un-align 64
389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    LDMFD_PC "r4-r10,fp"                    @ restore 9 regs and return
390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * String references.
394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrBadEntryPoint:
396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrBadEntryPoint
397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .global dvmAsmInstructionStart
401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .type   dvmAsmInstructionStart, %function
402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendvmAsmInstructionStart = .L_OP_NOP
403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .text
404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NOP: /* 0x00 */
408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NOP.S */
409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute it
412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#ifdef ASSIST_DEBUGGER
414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* insert fake function header to help gdb find the stack frame */
415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .type   dalvik_inst, %function
416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendalvik_inst:
417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .fnstart
418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    MTERP_ENTRY1
419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    MTERP_ENTRY2
420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .fnend
421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE: /* 0x01 */
427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE.S */
428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for move, move-object, long-to-int */
429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB */
430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
433a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[B]
434a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
435a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
436a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r0)                    @ fp[A]<- r2
437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute next instruction
438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_FROM16: /* 0x02 */
443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_FROM16.S */
444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for: move/from16, move-object/from16 */
445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBBBB */
446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
447a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
448a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
449a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
450a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
451a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r0)                    @ fp[AA]<- r2
452a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
453a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
454a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
456a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_16: /* 0x03 */
458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_16.S */
459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for: move/16, move-object/16 */
460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAAAA, vBBBB */
461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB
462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- AAAA
463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_WIDE: /* 0x04 */
473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_WIDE.S */
474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* move-wide vA, vB */
475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A(+)
477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15
479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* move-wide/from16 vAA, vBBBB */
493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r3, 1)                        @ r3<- BBBB
495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_WIDE_16: /* 0x06 */
508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_WIDE_16.S */
509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* move-wide/16 vAAAA, vBBBB */
510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r3, 2)                        @ r3<- BBBB
512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r2, 1)                        @ r2<- AAAA
513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
516445194bc141dc67e2f678aa1bbd5e59ca66254e5Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_OBJECT: /* 0x07 */
525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_OBJECT.S */
526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE.S */
527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for move, move-object, long-to-int */
528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB */
529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[B]
533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r0)                    @ fp[A]<- r2
536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute next instruction
537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_FROM16.S */
545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for: move/from16, move-object/from16 */
546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBBBB */
547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r0)                    @ fp[AA]<- r2
553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_OBJECT_16: /* 0x09 */
560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_OBJECT_16.S */
561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_16.S */
562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for: move/16, move-object/16 */
563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAAAA, vBBBB */
564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB
565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- AAAA
566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_RESULT: /* 0x0a */
577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_RESULT.S */
578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for: move-result, move-result-object */
579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA */
580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[AA]<- r0
585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* move-result-wide vAA */
593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_RESULT.S */
608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for: move-result, move-result-object */
609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA */
610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_retval]    @ r0<- glue->retval.i
613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[AA]<- r0
615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MOVE_EXCEPTION: /* 0x0d */
622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE_EXCEPTION.S */
623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* move-exception vAA */
624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offThread_exception]  @ r3<- dvmGetException bypass
627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0                      @ r1<- 0
628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offThread_exception]  @ dvmClearException bypass
632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_RETURN_VOID: /* 0x0e */
638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_RETURN_VOID.S */
639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_returnFromMethod
640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_RETURN: /* 0x0f */
645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_RETURN.S */
646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Return a 32-bit value.  Copies the return value into the "glue"
648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * structure, then jumps to the return handler.
649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: return, return-object
651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA */
653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vAA
655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_returnFromMethod
657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_RETURN_WIDE: /* 0x10 */
662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_RETURN_WIDE.S */
663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Return a 64-bit value.  Copies the return value into the "glue"
665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * structure, then jumps to the return handler.
666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* return-wide vAA */
668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rGLUE, #offGlue_retval  @ r3<- &glue->retval
671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r3, {r0-r1}                 @ retval<- r0/r1
673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_returnFromMethod
674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_RETURN_OBJECT: /* 0x11 */
679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_RETURN_OBJECT.S */
680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_RETURN.S */
681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Return a 32-bit value.  Copies the return value into the "glue"
683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * structure, then jumps to the return handler.
684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: return, return-object
686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA */
688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vAA
690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [rGLUE, #offGlue_retval] @ retval.i <- vAA
691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_returnFromMethod
692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_4: /* 0x12 */
698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_4.S */
699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const/4 vA, #+B */
700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A+
702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r0)                    @ fp[A]<- r1
707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute next instruction
708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_16: /* 0x13 */
713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_16.S */
714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const/16 vAA, #+BBBB */
715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r3)                    @ vAA<- r0
719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST: /* 0x14 */
726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST.S */
727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const vAA, #+BBBBbbbb */
728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- bbbb (low)
730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB (high)
731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r3)                    @ vAA<- r0
735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_HIGH16: /* 0x15 */
741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_HIGH16.S */
742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const/high16 vAA, #+BBBB0000 */
743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsl #16             @ r0<- BBBB0000
746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r3)                    @ vAA<- r0
748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_WIDE_16: /* 0x16 */
755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_WIDE_16.S */
756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const-wide/16 vAA, #+BBBB */
757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r0, asr #31             @ r1<- ssssssss
760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_WIDE_32: /* 0x17 */
770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_WIDE_32.S */
771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const-wide/32 vAA, #+BBBBbbbb */
772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r0, asr #31             @ r1<- ssssssss
779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_WIDE: /* 0x18 */
787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_WIDE.S */
788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- bbbb (low)
790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r3, 4)                        @ r3<- HHHH (high)
794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const-wide/high16 vAA, #+BBBB000000000000 */
808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #0                      @ r0<- 00000000
811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, lsl #16             @ r1<- BBBB0000
812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_STRING: /* 0x1a */
822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_STRING.S */
823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const/string vAA, String@BBBB */
824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ not yet resolved?
830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_CONST_STRING_resolve
831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_STRING_JUMBO: /* 0x1b */
839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_STRING_JUMBO.S */
840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const/string vAA, String@BBBBBBBB */
841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- bbbb (low)
842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB (high)
843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_CONST_STRING_JUMBO_resolve
850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CONST_CLASS: /* 0x1c */
858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CONST_CLASS.S */
859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* const/class vAA, Class@BBBB */
860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- glue->methodClassDex
862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ not yet resolved?
866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_CONST_CLASS_resolve
867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MONITOR_ENTER: /* 0x1d */
875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MONITOR_ENTER.S */
876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Synchronize on an object.
878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* monitor-enter vAA */
880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- vAA (object)
882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ null object?
884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ need for precise GC, MONITOR_TRACKING
885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ null object, throw an exception
886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmLockObject               @ call(self, obj)
888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#ifdef WITH_DEADLOCK_PREDICTION /* implies WITH_MONITOR_TRACKING */
889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offThread_exception] @ check for exception
891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0
892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_exceptionThrown      @ exception raised, bail out
893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MONITOR_EXIT: /* 0x1e */
901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MONITOR_EXIT.S */
902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Unlock an object.
904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Exceptions that occur when unlocking a monitor need to appear as
906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * if they happened at the following instruction.  See the Dalvik
907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instruction spec.
908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* monitor-exit vAA */
910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ before fetch: export the PC
912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- vAA (object)
913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ null object?
9146bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     1f                          @ yes
915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
9196bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     common_exceptionThrown      @ yes, exception is pending
920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9226bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee1:
9236bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    FETCH_ADVANCE_INST(1)               @ advance before throw
9246bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    b      common_errNullObject
925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CHECK_CAST: /* 0x1f */
930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CHECK_CAST.S */
931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Check to see if a cast from one class to another is allowed.
933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* check-cast vAA, class@BBBB */
935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r2, 1)                        @ r2<- BBBB
937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r3)                    @ r9<- object
938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]    @ r0<- pDvmDex
939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ is object null?
940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ have we resolved this before?
945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CHECK_CAST_resolved:
947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, r1                      @ same class (trivial success)?
948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CHECK_CAST_okay:
950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INSTANCE_OF: /* 0x20 */
957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INSTANCE_OF.S */
958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Check to see if an object reference is an instance of a class.
960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Most common situation is a non-null object, being compared against
962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an already-resolved class.
963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* instance-of vA, vB, class@CCCC */
965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB (object)
968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is object null?
970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- pDvmDex
971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r3, 1)                        @ r3<- CCCC
973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ have we resolved this before?
977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, r1                      @ same class (trivial success)?
980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ARRAY_LENGTH: /* 0x21 */
986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_ARRAY_LENGTH.S */
987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Return the length of an array.
989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is object null?
995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yup, fail
996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r3, r2)                    @ vB<- length
1000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NEW_INSTANCE: /* 0x22 */
1006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NEW_INSTANCE.S */
1007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Create a new instance of a class.
1009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* new-instance vAA, class@BBBB */
1011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
1013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ req'd for init, resolve, alloc
1016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
1017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
1018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_NEW_INSTANCE_resolved:   @ r0=class
1019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
1020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
1021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
1022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_NEW_INSTANCE_initialized: @ r0=class
1023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
1024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmAllocObject              @ r0<- new object
1025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_NEW_INSTANCE_finish          @ continue
1026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NEW_ARRAY: /* 0x23 */
1030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NEW_ARRAY.S */
1031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Allocate an array of objects, specified with the array class
1033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * and a count.
1034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * The verifier guarantees that this is an array class, so we don't
1036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * check for it here.
1037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* new-array vA, vB, class@CCCC */
1039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
1040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r2, 1)                        @ r2<- CCCC
1041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r0)                    @ r1<- vB (array length)
1043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ check length
1045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
1046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_errNegativeArraySize @ negative length, bail
1047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
1048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ req'd for resolve, alloc
1049a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
1050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
1051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
1055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Create a new array with elements filled from registers.
1058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: filled-new-array, filled-new-array/range
1060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
1065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ need for resolve and alloc
1067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
1070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
1071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #0                      @ r2<- false
1073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
1076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle exception
1077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_FILLED_NEW_ARRAY_continue
1078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Create a new array with elements filled from registers.
1086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: filled-new-array, filled-new-array/range
1088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
1092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
1093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ need for resolve and alloc
1095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
1098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
1099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
1100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #0                      @ r2<- false
1101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
1104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle exception
1105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* fill-array-data vAA, +BBBBBBBB */
1113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
1116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC();
1120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ 0 means an exception is thrown
1122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ has exception
1123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_THROW: /* 0x27 */
1130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_THROW.S */
1131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Throw an exception object in the current thread.
1133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* throw vAA */
1135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
1136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
1138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ null object?
1139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, throw an NPE instead
1140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ bypass dvmSetException, just store it
1141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offThread_exception]  @ thread->exception<- obj
1142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
1143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_GOTO: /* 0x28 */
1148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_GOTO.S */
1149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Unconditional branch, 8-bit offset.
1151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * The branch distance is a signed code-unit offset, which we need to
1153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * double to get a byte offset.
1154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* goto +AA */
1156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r0, asr #24             @ r9<- ssssssAA (sign-extended)
1158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, r9, lsl #1              @ r9<- byte offset
1159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_GOTO_16: /* 0x29 */
1176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_GOTO_16.S */
1177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Unconditional branch, 16-bit offset.
1179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * The branch distance is a signed code-unit offset, which we need to
1181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * double to get a byte offset.
1182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* goto/16 +AAAA */
1184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r0, asl #1              @ r9<- byte offset, check sign
1186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1198ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_GOTO_32: /* 0x2a */
1204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_GOTO_32.S */
1205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Unconditional branch, 32-bit offset.
1207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * The branch distance is a signed code-unit offset, which we need to
1209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * double to get a byte offset.
1210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Unlike most opcodes, this one is allowed to branch to itself, so
1212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * our "backward branch" test must be "<=0" instead of "<0".  The ORRS
1213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instruction doesn't affect the V flag, so we need to clear it
1214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * explicitly.
1215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* goto/32 +AAAAAAAA */
1217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     ip, ip                      @ (clear V flag during stall)
1220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    r0, r0, r1, lsl #16         @ r0<- AAAAaaaa, check sign
1221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, r0, asl #1              @ r9<- byte offset
1222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ble     common_backwardBranch       @ backward branch, do periodic checks
1223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_PACKED_SWITCH: /* 0x2b */
1239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_PACKED_SWITCH.S */
1240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a packed-switch or sparse-switch instruction.  In both cases
1242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * we decode it and hand it off to a helper function.
1243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * We don't really expect backward branches in a switch statement, but
1245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * they're perfectly legal, so we check for them here.
1246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: packed-switch, sparse-switch
1248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, +BBBB */
1250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
1253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vAA
1255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1265ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1266ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1267ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPARSE_SWITCH: /* 0x2c */
1277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPARSE_SWITCH.S */
1278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_PACKED_SWITCH.S */
1279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a packed-switch or sparse-switch instruction.  In both cases
1281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * we decode it and hand it off to a helper function.
1282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * We don't really expect backward branches in a switch statement, but
1284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * they're perfectly legal, so we check for them here.
1285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: packed-switch, sparse-switch
1287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, +BBBB */
1289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
1292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vAA
1294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r0, asl #1              @ r9<- branch byte offset, check sign
1297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_backwardBranch       @ (want to use BLE but V is unknown)
1299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1302ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1308ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1309ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1310ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1315a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1316a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CMPL_FLOAT: /* 0x2d */
1317968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_CMPL_FLOAT.S */
1318a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1319a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1320a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * destination register based on the results of the comparison.
1321a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1322a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * int compare(x, y) {
1323a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     if (x == y) {
1324a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 0;
1325a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x > y) {
1326a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 1;
1327a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x < y) {
1328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return -1;
1329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else {
1330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return -1;
1331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     }
1332a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * }
1333a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
1335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
13368fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
1337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
1338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
13398fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
13418fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    flds    s0, [r2]                    @ s0<- vBB
1342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s1, [r3]                    @ s1<- vCC
1343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fcmpes  s0, s1                      @ compare (vBB, vCC)
1344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvn     r0, #0                      @ r0<- -1 (default)
1346a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmstat                              @ export status flags
1348a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movgt   r0, #1                      @ (greater than) r1<- 1
1349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    moveq   r0, #0                      @ (equal) r1<- 0
13508fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    b       .LOP_CMPL_FLOAT_finish          @ argh
1351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1355a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CMPG_FLOAT: /* 0x2e */
1356968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_CMPG_FLOAT.S */
1357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * destination register based on the results of the comparison.
1360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * int compare(x, y) {
1362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     if (x == y) {
1363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 0;
1364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x < y) {
1365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return -1;
1366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x > y) {
1367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 1;
1368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else {
1369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 1;
1370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     }
1371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * }
1372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
1374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
13758fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
1376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
1377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
13788fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
13808fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    flds    s0, [r2]                    @ s0<- vBB
1381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s1, [r3]                    @ s1<- vCC
1382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fcmpes  s0, s1                      @ compare (vBB, vCC)
1383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #1                      @ r0<- 1 (default)
1385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmstat                              @ export status flags
1387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvnmi   r0, #0                      @ (less than) r1<- -1
1388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    moveq   r0, #0                      @ (equal) r1<- 0
13898fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    b       .LOP_CMPG_FLOAT_finish          @ argh
1390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CMPL_DOUBLE: /* 0x2f */
1395968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_CMPL_DOUBLE.S */
1396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * destination register based on the results of the comparison.
1399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * int compare(x, y) {
1401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     if (x == y) {
1402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 0;
1403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x > y) {
1404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 1;
1405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x < y) {
1406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return -1;
1407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else {
1408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return -1;
1409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     }
1410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * }
1411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
1413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
14148fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
1415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
1416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
14178fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
14198fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    fldd    d0, [r2]                    @ d0<- vBB
1420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d1, [r3]                    @ d1<- vCC
1421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fcmped  d0, d1                      @ compare (vBB, vCC)
1422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvn     r0, #0                      @ r0<- -1 (default)
1424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmstat                              @ export status flags
1426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movgt   r0, #1                      @ (greater than) r1<- 1
1427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    moveq   r0, #0                      @ (equal) r1<- 0
14288fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    b       .LOP_CMPL_DOUBLE_finish          @ argh
1429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1433a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CMPG_DOUBLE: /* 0x30 */
1434968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_CMPG_DOUBLE.S */
1435a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1436a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * destination register based on the results of the comparison.
1438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * int compare(x, y) {
1440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     if (x == y) {
1441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 0;
1442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x < y) {
1443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return -1;
1444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else if (x > y) {
1445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 1;
1446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     } else {
1447a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *         return 1;
1448a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     }
1449a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * }
1450a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1451a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
1452a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
14538fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
1454a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
1455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
14568fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
14588fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    fldd    d0, [r2]                    @ d0<- vBB
1459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d1, [r3]                    @ d1<- vCC
1460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fcmped  d0, d1                      @ compare (vBB, vCC)
1461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #1                      @ r0<- 1 (default)
1463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmstat                              @ export status flags
1465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvnmi   r0, #0                      @ (less than) r1<- -1
1466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    moveq   r0, #0                      @ (equal) r1<- 0
14678fd923e066208c4bbebe5677cac4d11a629bac1bAndy McFadden    b       .LOP_CMPG_DOUBLE_finish          @ argh
1468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_CMP_LONG: /* 0x31 */
1473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_CMP_LONG.S */
1474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * register based on the results of the comparison.
1477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * We load the full values with LDM, but in practice many values could
1479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * be resolved by only looking at the high word.  This could be made
1480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * faster or slower by splitting the LDM into a pair of LDRs.
1481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If we just wanted to set condition flags, we could do this:
1483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  subs    ip, r0, r2
1484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  sbcs    ip, r1, r3
1485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  subeqs  ip, r0, r2
1486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * integer value, which we can do with 2 conditional mov/mvn instructions
1488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * us a constant 5-cycle path plus a branch at the end to the
1490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instruction epilogue code.  The multi-compare approach below needs
1491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * in the worst case (the 64-bit values are equal).
1493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* cmp-long vAA, vBB, vCC */
1495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
1496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
1497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
1498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
1499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bgt     .LOP_CMP_LONG_greater
1506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r1, r0, r2                  @ r1<- r0 - r2
1507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_CMP_LONG_less
1509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_EQ: /* 0x32 */
1514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_EQ.S */
1515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/bincmp.S */
1516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vA, vB, +CCCC */
1524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A+
1525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
1526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
1527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r1)                    @ r3<- vB
1528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vA
1529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (vA, vB)
1531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne  1f                      @ branch to 1 if comparison failed
1532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ yes, do periodic checks
1535ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1536ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1537ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1538ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1539ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1540ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1541ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1544ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_NE: /* 0x33 */
1551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_NE.S */
1552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/bincmp.S */
1553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vA, vB, +CCCC */
1561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A+
1562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
1563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
1564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r1)                    @ r3<- vB
1565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vA
1566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (vA, vB)
1568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq  1f                      @ branch to 1 if comparison failed
1569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ yes, do periodic checks
1572ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1573ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1574ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1575ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1576ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1577ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1578ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1581ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_LT: /* 0x34 */
1588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_LT.S */
1589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/bincmp.S */
1590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vA, vB, +CCCC */
1598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A+
1599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
1600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
1601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r1)                    @ r3<- vB
1602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vA
1603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (vA, vB)
1605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bge  1f                      @ branch to 1 if comparison failed
1606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ yes, do periodic checks
1609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1610ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1612ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1613ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1614ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1618ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_GE: /* 0x35 */
1625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_GE.S */
1626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/bincmp.S */
1627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vA, vB, +CCCC */
1635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A+
1636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
1637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
1638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r1)                    @ r3<- vB
1639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vA
1640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (vA, vB)
1642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    blt  1f                      @ branch to 1 if comparison failed
1643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ yes, do periodic checks
1646ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1647ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1648ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1649ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1650ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1651ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1652ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1655ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_GT: /* 0x36 */
1662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_GT.S */
1663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/bincmp.S */
1664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vA, vB, +CCCC */
1672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A+
1673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
1674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
1675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r1)                    @ r3<- vB
1676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vA
1677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (vA, vB)
1679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ble  1f                      @ branch to 1 if comparison failed
1680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ yes, do periodic checks
1683ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1684ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1685ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1686ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1687ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1688ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1689ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1692ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_LE: /* 0x37 */
1699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_LE.S */
1700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/bincmp.S */
1701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vA, vB, +CCCC */
1709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A+
1710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
1711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
1712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r1)                    @ r3<- vB
1713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vA
1714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (vA, vB)
1716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bgt  1f                      @ branch to 1 if comparison failed
1717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ yes, do periodic checks
1720ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1721ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1722ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b        common_testUpdateProfile
1725ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1729ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_EQZ: /* 0x38 */
1736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_EQZ.S */
1737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/zcmp.S */
1738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vAA, +BBBB */
1746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
1747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vAA
1748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ compare (vA, 0)
1750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne  1f                      @ branch to 1 if comparison failed
1751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1754ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1755ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1756ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1757ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1758ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1759ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1762ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1763ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_NEZ: /* 0x39 */
1773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_NEZ.S */
1774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/zcmp.S */
1775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vAA, +BBBB */
1783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
1784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vAA
1785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ compare (vA, 0)
1787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq  1f                      @ branch to 1 if comparison failed
1788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1791ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1792ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1793ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1794ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1795ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1799ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1800ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1801ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1802ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1803ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_LTZ: /* 0x3a */
1810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_LTZ.S */
1811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/zcmp.S */
1812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vAA, +BBBB */
1820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
1821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vAA
1822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ compare (vA, 0)
1824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bge  1f                      @ branch to 1 if comparison failed
1825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1828ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1829ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1830ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1831ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1832ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1833ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1836ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1837ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1838ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1839ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1840ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_GEZ: /* 0x3b */
1847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_GEZ.S */
1848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/zcmp.S */
1849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vAA, +BBBB */
1857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
1858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vAA
1859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ compare (vA, 0)
1861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    blt  1f                      @ branch to 1 if comparison failed
1862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1865ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1866ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1867ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1868ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1869ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1870ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1871ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1872ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1873ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1874ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1877ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_GTZ: /* 0x3c */
1884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_GTZ.S */
1885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/zcmp.S */
1886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vAA, +BBBB */
1894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
1895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vAA
1896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ compare (vA, 0)
1898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ble  1f                      @ branch to 1 if comparison failed
1899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1902ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1903ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1904ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1905ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1906ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1907ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1908ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1909ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1910ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1911ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1914ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IF_LEZ: /* 0x3d */
1921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IF_LEZ.S */
1922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/zcmp.S */
1923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
1924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * fragment that specifies the *reverse* comparison to perform, e.g.
1926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for "if-le" you would use "gt".
1927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
1928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
1930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* if-cmp vAA, +BBBB */
1931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
1932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vAA
1933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #4                      @ r0<- BYTE branch dist for not-taken
1934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ compare (vA, 0)
1935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bgt  1f                      @ branch to 1 if comparison failed
1936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r9, 1)                      @ r9<- branch offset, in code units
1937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r9, r9, asl #1              @ convert to bytes, check sign
1938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     common_backwardBranch       @ backward branch, do periodic checks
1939ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
1940ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
1941ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
1942ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1943ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1944ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
1947ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
1948ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
1949ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1950ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1951ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
1952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_3E: /* 0x3e */
1958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_3E.S */
1959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
1960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
1961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_3F: /* 0x3f */
1967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_3F.S */
1968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
1969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
1970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_40: /* 0x40 */
1976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_40.S */
1977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
1978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
1979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_41: /* 0x41 */
1985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_41.S */
1986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
1987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
1988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
1992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
1993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_42: /* 0x42 */
1994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_42.S */
1995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
1996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
1997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
1999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_43: /* 0x43 */
2003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_43.S */
2004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
2005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
2006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AGET: /* 0x44 */
2012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET.S */
2013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r9)                    @ vAA<- r2
2037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AGET_WIDE: /* 0x45 */
2043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET_WIDE.S */
2044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array get, 64 bits.  vAA <- vBB[vCC].
2046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2049a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* aget-wide vAA, vBB, vCC */
2050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
2051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
2053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
2054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
2062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_errArrayIndex        @ index >= length, bail
2063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ May want to swap the order of these two branches depending on how the
2064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ branch prediction (if any) handles conditional forward branches vs.
2065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ unconditional forward branches.
2066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AGET_OBJECT: /* 0x46 */
2070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET_OBJECT.S */
2071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET.S */
2072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r9)                    @ vAA<- r2
2096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AGET_BOOLEAN: /* 0x47 */
2103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET_BOOLEAN.S */
2104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET.S */
2105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r9)                    @ vAA<- r2
2129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AGET_BYTE: /* 0x48 */
2136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET_BYTE.S */
2137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET.S */
2138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r9)                    @ vAA<- r2
2162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AGET_CHAR: /* 0x49 */
2169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET_CHAR.S */
2170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET.S */
2171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r9)                    @ vAA<- r2
2195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AGET_SHORT: /* 0x4a */
2202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET_SHORT.S */
2203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AGET.S */
2204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r9)                    @ vAA<- r2
2228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_APUT: /* 0x4b */
2235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT.S */
2236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r9)                    @ r2<- vAA
2258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_APUT_WIDE: /* 0x4c */
2266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT_WIDE.S */
2267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array put, 64 bits.  vBB[vCC] <- vAA.
2269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* aput-wide vAA, vBB, vCC */
2273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
2274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
2276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
2277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_errArrayIndex        @ index >= length, bail
2287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ May want to swap the order of these two branches depending on how the
2288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ branch prediction (if any) handles conditional forward branches vs.
2289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ unconditional forward branches.
2290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_APUT_OBJECT: /* 0x4d */
2294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT_OBJECT.S */
2295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Store an object into an array.  vBB[vCC] <- vAA.
2297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2302a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
2303a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
2305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
2306a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- vBB (array object)
2307a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
2308a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ null array object?
2309a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r9)                    @ r9<- vAA
2310a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r1, #offArrayObject_length]    @ r3<- arrayObj->length
2312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r10, r1, r0, lsl #2         @ r10<- arrayObj + index*width
2313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, r3                      @ compare unsigned index, length
2314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2315a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_errArrayIndex        @ index >= length, bail
2316a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2317a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2318a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2319a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2320a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_APUT_BOOLEAN: /* 0x4e */
2321a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT_BOOLEAN.S */
2322a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT.S */
2323a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2324a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2325a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2326a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2327a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2332a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2333a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r9)                    @ r2<- vAA
2345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2346a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2348a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2350a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_APUT_BYTE: /* 0x4f */
2354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT_BYTE.S */
2355a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT.S */
2356a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2375a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r9)                    @ r2<- vAA
2378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_APUT_CHAR: /* 0x50 */
2387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT_CHAR.S */
2388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT.S */
2389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r9)                    @ r2<- vAA
2411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_APUT_SHORT: /* 0x51 */
2420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT_SHORT.S */
2421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_APUT.S */
2422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * instructions.  We use a pair of FETCH_Bs instead.
2427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, vBB, vCC */
2431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r2, 1, 0)                   @ r2<- BB
2432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2433a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_B(r3, 1, 1)                   @ r3<- CC
2434a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2435a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2436a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null array object?
2437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, bail
2438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, r3                      @ compare unsigned index, length
2441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     common_errArrayIndex        @ index >= length, bail
2442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r9)                    @ r2<- vAA
2444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2447a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2448a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2449a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2450a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2451a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2452a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET: /* 0x52 */
2453a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET.S */
2454a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field get.
2456a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_finish          @ no, already resolved
2468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
2473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_finish
2474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_WIDE: /* 0x53 */
2479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_WIDE.S */
2480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Wide 32-bit instance field get.
2482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* iget-wide vA, vB, field@CCCC */
2484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
2492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
2497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_WIDE_finish
2498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_OBJECT: /* 0x54 */
2503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_OBJECT.S */
2504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET.S */
2505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field get.
2507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
2519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
2524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_OBJECT_finish
2525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_BOOLEAN: /* 0x55 */
2531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_BOOLEAN.S */
2532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET.S */
2534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field get.
2536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
2548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
2553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_BOOLEAN_finish
2554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_BYTE: /* 0x56 */
2560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_BYTE.S */
2561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET.S */
2563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field get.
2565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
2577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
2582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_BYTE_finish
2583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_CHAR: /* 0x57 */
2589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_CHAR.S */
2590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET.S */
2592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field get.
2594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
2606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
2611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_CHAR_finish
2612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_SHORT: /* 0x58 */
2618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_SHORT.S */
2619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET.S */
2621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field get.
2623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
2635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0
2640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IGET_SHORT_finish
2641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT: /* 0x59 */
2647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT.S */
2648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field put.
2650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_finish          @ no, already resolved
2662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
2667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_finish          @ yes, finish up
2668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_WIDE: /* 0x5a */
2673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_WIDE.S */
2674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* iput-wide vA, vB, field@CCCC */
2675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
2683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
2684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
2688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_OBJECT: /* 0x5b */
2694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_OBJECT.S */
2695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT.S */
2696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field put.
2698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
2710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
2715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_BOOLEAN: /* 0x5c */
2722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_BOOLEAN.S */
2723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT.S */
2725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field put.
2727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
2739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
2744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_BYTE: /* 0x5d */
2751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_BYTE.S */
2752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT.S */
2754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field put.
2756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
2768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
2773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_CHAR: /* 0x5e */
2780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_CHAR.S */
2781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT.S */
2783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field put.
2785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
2797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
2802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_SHORT: /* 0x5f */
2809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_SHORT.S */
2810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT.S */
2812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit instance field put.
2814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, field@CCCC */
2818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
2819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
2820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
2821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
2826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden8:  ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
2827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
2828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
2831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
2833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SGET: /* 0x60 */
2838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET.S */
2839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SGET handler.
2841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
2845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
2847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SGET_resolve         @ yes, do resolve
2851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_finish: @ field ptr in r0
2852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
2854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SGET_WIDE: /* 0x61 */
2862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET_WIDE.S */
2863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 64-bit SGET handler.
2865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* sget-wide vAA, field@BBBB */
2867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
2869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_WIDE_finish:
2874861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2875861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
2876861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2877861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
2878861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
2879861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2880861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
2881861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2883861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SGET_OBJECT: /* 0x62 */
2890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET_OBJECT.S */
2891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET.S */
2892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SGET handler.
2894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
2898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
2900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_OBJECT_finish: @ field ptr in r0
2905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
2907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SGET_BOOLEAN: /* 0x63 */
2916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET_BOOLEAN.S */
2917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET.S */
2918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SGET handler.
2920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
2924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
2926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
2933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SGET_BYTE: /* 0x64 */
2942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET_BYTE.S */
2943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET.S */
2944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SGET handler.
2946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
2950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
2952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_BYTE_finish: @ field ptr in r0
2957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
2959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SGET_CHAR: /* 0x65 */
2968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET_CHAR.S */
2969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET.S */
2970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SGET handler.
2972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
2975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
2976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
2977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
2978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
2979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
2980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
2981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_CHAR_finish: @ field ptr in r0
2983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
2985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
2989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
2991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
2992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
2993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SGET_SHORT: /* 0x66 */
2994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET_SHORT.S */
2995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SGET.S */
2996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
2997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SGET handler.
2998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
2999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
3002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
3007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
3008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_SHORT_finish: @ field ptr in r0
3009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
3010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
3011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
3013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPUT: /* 0x67 */
3020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT.S */
3021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SPUT handler.
3023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
3027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
3032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SPUT_resolve         @ yes, do resolve
3033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_finish:   @ field ptr in r0
3034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
3035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
3039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPUT_WIDE: /* 0x68 */
3044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT_WIDE.S */
3045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 64-bit SPUT handler.
3047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* sput-wide vAA, field@BBBB */
3049861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]  @ r0<- DvmDex
3050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3051861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
3052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
3053861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
3054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
3055861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
3056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
3057861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
3058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3059861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
3060861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
3061861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
3062861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
3063861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
3064861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
3065861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
3066861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
3067861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
3068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPUT_OBJECT: /* 0x69 */
3072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT_OBJECT.S */
3073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT.S */
3074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SPUT handler.
3076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
3080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
3085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
3086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
3087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
3088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
3092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPUT_BOOLEAN: /* 0x6a */
3098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT_BOOLEAN.S */
3099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT.S */
3100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SPUT handler.
3102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
3106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
3111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
3112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
3113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
3114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
3118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPUT_BYTE: /* 0x6b */
3124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT_BYTE.S */
3125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT.S */
3126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SPUT handler.
3128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
3132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
3137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
3138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
3140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
3144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPUT_CHAR: /* 0x6c */
3150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT_CHAR.S */
3151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT.S */
3152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SPUT handler.
3154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
3158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
3163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
3166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
3170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SPUT_SHORT: /* 0x6d */
3176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT_SHORT.S */
3177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SPUT.S */
3178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * General 32-bit SPUT handler.
3180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
3182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, field@BBBB */
3184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
3185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
3186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
3187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
3188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is resolved entry null?
3189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
3192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
3196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a virtual method call.
3205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-virtual, invoke-virtual/range
3207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!0)
3216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
3226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
3228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_SUPER: /* 0x6f */
3232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_SUPER.S */
3233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a "super" method call.
3235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-super, invoke-super/range
3237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!0)
3243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ null "this"?
3250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ null "this", throw exception
3252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_DIRECT: /* 0x70 */
3261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_DIRECT.S */
3262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a direct method call.
3264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * (We could defer the "is 'this' pointer null" test to the common
3266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * method invocation code, and use a flag to indicate that static
3267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * calls don't count.  If we do this as part of copying the arguments
3268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * out we could avoiding loading the first arg twice.)
3269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-direct, invoke-direct/range
3271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!0)
3280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_DIRECT_finish:
3287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ null "this" ref?
3288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_invokeMethodNoRange   @ no, continue on
3289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_errNullObject        @ yes, throw exception
3290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_STATIC: /* 0x71 */
3294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_STATIC.S */
3295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a static method call.
3297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-static, invoke-static/range
3299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3302a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3303a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3306a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3307a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3308a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_invokeMethodNoRange @ yes, continue on
3309a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3310a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_STATIC          @ resolver method type
3312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
3314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_invokeMethodNoRange @ no, continue
3315a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
3316a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3317a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3318a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3319a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3320a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_INTERFACE: /* 0x72 */
3321a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_INTERFACE.S */
3322a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3323a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle an interface method call.
3324a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3325a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-interface, invoke-interface/range
3326a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3327a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!0)
3332a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3333a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null obj?
3338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, fail
3340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
3343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle exception
3344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_invokeMethodNoRange @ jump to common handler
3345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3346a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3348a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_73: /* 0x73 */
3350a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_73.S */
3351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
3352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
3353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3355a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3356a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a virtual method call.
3363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-virtual, invoke-virtual/range
3365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!1)
3374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3375a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
3384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
3386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_SUPER.S */
3393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a "super" method call.
3395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-super, invoke-super/range
3397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!1)
3403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ null "this"?
3410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, [rGLUE, #offGlue_method] @ r9<- current method
3411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ null "this", throw exception
3412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, [r9, #offMethod_clazz]  @ r9<- method->clazz
3414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_DIRECT.S */
3424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a direct method call.
3426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * (We could defer the "is 'this' pointer null" test to the common
3428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * method invocation code, and use a flag to indicate that static
3429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * calls don't count.  If we do this as part of copying the arguments
3430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * out we could avoiding loading the first arg twice.)
3431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-direct, invoke-direct/range
3433a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3434a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3435a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3436a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!1)
3442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r10)                   @ r2<- "this" ptr
3447a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3448a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_DIRECT_RANGE_finish:
3449a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ null "this" ref?
3450a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_invokeMethodRange   @ no, continue on
3451a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_errNullObject        @ yes, throw exception
3452a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3453a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3454a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3456a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_STATIC.S */
3459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a static method call.
3461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-static, invoke-static/range
3463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- pDvmDex
3467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ already resolved?
3471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_invokeMethodRange @ yes, continue on
3473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden0:  ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
3474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_STATIC          @ resolver method type
3476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
3478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_invokeMethodRange @ no, continue
3479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
3480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_INTERFACE.S */
3488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle an interface method call.
3490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: invoke-interface, invoke-interface/range
3492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
3497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!1)
3498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
3500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
3501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- first arg ("this")
3502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- methodClassDex
3503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null obj?
3504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]  @ r2<- method
3505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ yes, fail
3506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offObject_clazz]  @ r0<- thisPtr->clazz
3507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
3509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle exception
3510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_invokeMethodRange @ jump to common handler
3511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_79: /* 0x79 */
3517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_79.S */
3518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
3519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
3520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_7A: /* 0x7a */
3526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_7A.S */
3527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
3528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
3529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NEG_INT: /* 0x7b */
3535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NEG_INT.S */
3536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unop.S */
3537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary operation.  Provide an "instr" line that
3539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0".
3540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      int-to-byte, int-to-char, int-to-short
3544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
3549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
3555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 9-10 instructions */
3557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NOT_INT: /* 0x7c */
3562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NOT_INT.S */
3563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unop.S */
3564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary operation.  Provide an "instr" line that
3566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0".
3567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      int-to-byte, int-to-char, int-to-short
3571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
3576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
3582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 9-10 instructions */
3584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NEG_LONG: /* 0x7d */
3589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NEG_LONG.S */
3590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopWide.S */
3591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit unary operation.  Provide an "instr" line that
3593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0/r1".
3594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-13 instructions */
3612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NOT_LONG: /* 0x7e */
3618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NOT_LONG.S */
3619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopWide.S */
3620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit unary operation.  Provide an "instr" line that
3622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0/r1".
3623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvn     r0, r0                           @ optional op; may set condition codes
3636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-13 instructions */
3641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NEG_FLOAT: /* 0x7f */
3647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NEG_FLOAT.S */
3648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unop.S */
3649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary operation.  Provide an "instr" line that
3651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0".
3652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      int-to-byte, int-to-char, int-to-short
3656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
3661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
3667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 9-10 instructions */
3669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_NEG_DOUBLE: /* 0x80 */
3674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_NEG_DOUBLE.S */
3675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopWide.S */
3676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit unary operation.  Provide an "instr" line that
3678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0/r1".
3679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-13 instructions */
3697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INT_TO_LONG: /* 0x81 */
3703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INT_TO_LONG.S */
3704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopWider.S */
3705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = op r0", where
3708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "result" is a 64-bit quantity in r0/r1.
3709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: int-to-long, int-to-double, float-to-long, float-to-double
3711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
3717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-11 instructions */
3725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INT_TO_FLOAT: /* 0x82 */
3730968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_INT_TO_FLOAT.S */
3731968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/funop.S */
3732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * line that specifies an instruction that performs "s1 = op s0".
3735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: int-to-float, float-to-int
3737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
374038214bbeeb2980609919978f17b009d896023491Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r3]                    @ s0<- vB
3743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
3745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsitos  s1, s0                              @ s1<- op
3746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s1, [r9]                    @ vA<- s1
3749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INT_TO_DOUBLE: /* 0x83 */
3755968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_INT_TO_DOUBLE.S */
3756968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/funopWider.S */
3757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "instr" line that specifies an instruction that performs "d0 = op s0".
3760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: int-to-double, float-to-double
3762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
376538214bbeeb2980609919978f17b009d896023491Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r3]                    @ s0<- vB
3768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
3770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsitod  d0, s0                              @ d0<- op
3771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d0, [r9]                    @ vA<- d0
3774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_LONG_TO_INT: /* 0x84 */
3780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_LONG_TO_INT.S */
3781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* we ignore the high word, making this equivalent to a 32-bit reg move */
3782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MOVE.S */
3783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* for move, move-object, long-to-int */
3784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB */
3785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[B]
3789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
3790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r2, r0)                    @ fp[A]<- r2
3792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute next instruction
3793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_LONG_TO_FLOAT: /* 0x85 */
3799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_LONG_TO_FLOAT.S */
3800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopNarrower.S */
3801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = op r0/r1", where
3804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "result" is a 32-bit quantity in r0.
3805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: long-to-float, double-to-int, double-to-float
3807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * (This would work for long-to-int, but that instruction is actually
3809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an exact match for OP_MOVE.)
3810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vA<- r0
3822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-11 instructions */
3824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopWide.S */
3831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit unary operation.  Provide an "instr" line that
3833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0/r1".
3834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-13 instructions */
3852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_FLOAT_TO_INT: /* 0x87 */
3858968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_FLOAT_TO_INT.S */
3859968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/funop.S */
3860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * line that specifies an instruction that performs "s1 = op s0".
3863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: int-to-float, float-to-int
3865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
386838214bbeeb2980609919978f17b009d896023491Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r3]                    @ s0<- vB
3871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
3873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ftosizs s1, s0                              @ s1<- op
3874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s1, [r9]                    @ vA<- s1
3877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_FLOAT_TO_LONG: /* 0x88 */
3883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_FLOAT_TO_LONG.S */
3884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopWider.S */
3886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = op r0", where
3889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "result" is a 64-bit quantity in r0/r1.
3890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: int-to-long, int-to-double, float-to-long, float-to-double
3892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
3898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-11 instructions */
3906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3912968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_FLOAT_TO_DOUBLE.S */
3913968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/funopWider.S */
3914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "instr" line that specifies an instruction that performs "d0 = op s0".
3917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: int-to-double, float-to-double
3919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
392238214bbeeb2980609919978f17b009d896023491Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r3]                    @ s0<- vB
3925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
3927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fcvtds  d0, s0                              @ d0<- op
3928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d0, [r9]                    @ vA<- d0
3931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DOUBLE_TO_INT: /* 0x8a */
3937968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_DOUBLE_TO_INT.S */
3938968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/funopNarrower.S */
3939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "instr" line that specifies an instruction that performs "s0 = op d0".
3942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: double-to-int, double-to-float
3944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
394738214bbeeb2980609919978f17b009d896023491Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r3]                    @ d0<- vB
3950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
3952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ftosizd  s0, d0                              @ s0<- op
3953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s0, [r9]                    @ vA<- s0
3956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_DOUBLE_TO_LONG.S */
3963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unopWide.S */
3965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit unary operation.  Provide an "instr" line that
3967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0/r1".
3968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
3969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
3972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
3973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
3974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
3975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
3976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
3981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
3985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-13 instructions */
3986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
3990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
3991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
3992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3993968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_DOUBLE_TO_FLOAT.S */
3994968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/funopNarrower.S */
3995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
3996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "instr" line that specifies an instruction that performs "s0 = op d0".
3998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
3999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: double-to-int, double-to-float
4000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
4002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
400338214bbeeb2980609919978f17b009d896023491Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
4004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
4005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r3]                    @ d0<- vB
4006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
4008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fcvtsd  s0, d0                              @ s0<- op
4009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
4011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s0, [r9]                    @ vA<- s0
4012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INT_TO_BYTE: /* 0x8d */
4018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INT_TO_BYTE.S */
4019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unop.S */
4020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary operation.  Provide an "instr" line that
4022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0".
4023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
4024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      int-to-byte, int-to-char, int-to-short
4027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
4029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
4030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
4031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
4032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
4033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl #24                           @ optional op; may set condition codes
4034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
4036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
4038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 9-10 instructions */
4040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INT_TO_CHAR: /* 0x8e */
4045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INT_TO_CHAR.S */
4046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unop.S */
4047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary operation.  Provide an "instr" line that
4049a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0".
4050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
4051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      int-to-byte, int-to-char, int-to-short
4054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
4056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
4057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
4058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
4059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
4060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
4063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
4065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 9-10 instructions */
4067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INT_TO_SHORT: /* 0x8f */
4072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INT_TO_SHORT.S */
4073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unop.S */
4074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit unary operation.  Provide an "instr" line that
4076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = op r0".
4077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.
4078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      int-to-byte, int-to-char, int-to-short
4081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* unop vA, vB */
4083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
4084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
4085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB
4086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
4087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
4090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
4092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 9-10 instructions */
4094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_INT: /* 0x90 */
4099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_ADD_INT.S */
4100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_INT: /* 0x91 */
4141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SUB_INT.S */
4142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_INT: /* 0x92 */
4183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MUL_INT.S */
4184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_INT: /* 0x93 */
4226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_DIV_INT.S */
4227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
4251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_INT: /* 0x94 */
4268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_INT.S */
4269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* idivmod returns quotient in r0 and remainder in r1 */
4270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
4294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4302a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r9)               @ vAA<- r1
4303a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4306a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4307a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4308a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4309a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4310a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AND_INT: /* 0x95 */
4311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AND_INT.S */
4312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4315a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4316a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4317a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4318a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4319a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4320a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4321a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4322a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4323a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4324a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4325a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4326a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4327a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4332a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4333a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4346a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4348a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4350a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_OR_INT: /* 0x96 */
4353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_OR_INT.S */
4354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4355a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4356a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4375a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_XOR_INT: /* 0x97 */
4395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_XOR_INT.S */
4396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4433a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4434a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4435a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4436a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHL_INT: /* 0x98 */
4437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHL_INT.S */
4438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4447a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4448a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4449a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4450a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4451a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4452a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4453a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4454a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4456a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
4468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHR_INT: /* 0x99 */
4479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHR_INT.S */
4480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
4510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_USHR_INT: /* 0x9a */
4521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_USHR_INT.S */
4522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
4523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
4525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
4526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
4531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
4533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
4537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
4544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
4545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
4547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
4552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
4555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
4557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_LONG: /* 0x9b */
4563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_ADD_LONG.S */
4564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
4565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
4567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
4573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
4576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
4577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    adds    r0, r0, r2                           @ optional op; may set condition codes
4597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
4602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_LONG: /* 0x9c */
4608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SUB_LONG.S */
4609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
4610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
4612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
4618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
4621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
4622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r0, r0, r2                           @ optional op; may set condition codes
4642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
4647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_LONG: /* 0x9d */
4653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MUL_LONG.S */
4654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Signed 64-bit integer multiply.
4656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *        WX
4659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      x YZ
4660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  --------
4661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *     ZW ZX
4662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  YW YX
4663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * The low word of the result holds ZX, the high word holds
4665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * it doesn't fit in the low 64 bits.
4667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Unlike most ARM math operations, multiply instructions have
4669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * restrictions on using the same register more than once (Rd and Rm
4670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * cannot be the same).
4671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* mul-long vAA, vBB, vCC */
4673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mul     ip, r2, r1                  @  ip<- ZxW
4681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
4684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_MUL_LONG_finish
4688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_LONG: /* 0x9e */
4692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_DIV_LONG.S */
4693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
4694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
4696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
4702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
4705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
4706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
4720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
4731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_LONG: /* 0x9f */
4737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_LONG.S */
4738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
4740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
4742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
4748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
4751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
4752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
4766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
4772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
4777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AND_LONG: /* 0xa0 */
4783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AND_LONG.S */
4784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
4785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
4787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
4793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
4796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
4797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, r2                           @ optional op; may set condition codes
4817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
4822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_OR_LONG: /* 0xa1 */
4828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_OR_LONG.S */
4829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
4830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
4832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
4838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
4841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
4842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r2                           @ optional op; may set condition codes
4862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
4867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_XOR_LONG: /* 0xa2 */
4873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_XOR_LONG.S */
4874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
4875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
4877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
4879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
4880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
4883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
4886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
4887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
4888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
4891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
4894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
4895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
4901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
4903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
4904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r0, r0, r2                           @ optional op; may set condition codes
4907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
4911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
4912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHL_LONG: /* 0xa3 */
4918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHL_LONG.S */
4919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Long integer shift.  This is different from the generic 32/64-bit
4921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 6 bits of the shift distance.
4924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* shl-long vAA, vBB, vCC */
4926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r3, r0, #255                @ r3<- BB
4929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr #8              @ r0<- CC
4930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vCC
4932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, asl r2              @  r1<- r1 << r2
4937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r3, r2, #32                 @  r3<- 32 - r2
4938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    ip, r2, #32                 @  ip<- r2 - 32
4940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_SHL_LONG_finish
4943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHR_LONG: /* 0xa4 */
4947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHR_LONG.S */
4948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Long integer shift.  This is different from the generic 32/64-bit
4950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 6 bits of the shift distance.
4953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* shr-long vAA, vBB, vCC */
4955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r3, r0, #255                @ r3<- BB
4958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr #8              @ r0<- CC
4959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vCC
4961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r3, r2, #32                 @  r3<- 32 - r2
4967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    ip, r2, #32                 @  ip<- r2 - 32
4969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_SHR_LONG_finish
4972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
4974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
4975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_USHR_LONG: /* 0xa5 */
4976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_USHR_LONG.S */
4977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
4978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Long integer shift.  This is different from the generic 32/64-bit
4979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 6 bits of the shift distance.
4982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
4983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* ushr-long vAA, vBB, vCC */
4984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
4985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
4986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r3, r0, #255                @ r3<- BB
4987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr #8              @ r0<- CC
4988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r0)                    @ r2<- vCC
4990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
4994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r3, r2, #32                 @  r3<- 32 - r2
4996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    ip, r2, #32                 @  ip<- r2 - 32
4998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_USHR_LONG_finish
5001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_FLOAT: /* 0xa6 */
5005968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_ADD_FLOAT.S */
5006968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop.S */
5007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating-point operation.  Provide an "instr" line that
5009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "s2 = s0 op s1".  Because we
5010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * use the "softfp" ABI, this must be an instruction, not a function call.
5011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float, sub-float, mul-float, div-float
5013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* floatop vAA, vBB, vCC */
5015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
501938214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
502138214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vCC
5022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r2]                    @ s0<- vBB
5023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fadds   s2, s0, s1                              @ s2<- op
5026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
5029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_FLOAT: /* 0xa7 */
5035968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_SUB_FLOAT.S */
5036968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop.S */
5037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating-point operation.  Provide an "instr" line that
5039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "s2 = s0 op s1".  Because we
5040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * use the "softfp" ABI, this must be an instruction, not a function call.
5041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float, sub-float, mul-float, div-float
5043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* floatop vAA, vBB, vCC */
5045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
504938214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
505138214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vCC
5052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r2]                    @ s0<- vBB
5053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsubs   s2, s0, s1                              @ s2<- op
5056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
5059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_FLOAT: /* 0xa8 */
5065968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_MUL_FLOAT.S */
5066968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop.S */
5067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating-point operation.  Provide an "instr" line that
5069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "s2 = s0 op s1".  Because we
5070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * use the "softfp" ABI, this must be an instruction, not a function call.
5071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float, sub-float, mul-float, div-float
5073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* floatop vAA, vBB, vCC */
5075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
507938214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
508138214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vCC
5082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r2]                    @ s0<- vBB
5083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmuls   s2, s0, s1                              @ s2<- op
5086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
5089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_FLOAT: /* 0xa9 */
5095968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_DIV_FLOAT.S */
5096968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop.S */
5097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating-point operation.  Provide an "instr" line that
5099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "s2 = s0 op s1".  Because we
5100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * use the "softfp" ABI, this must be an instruction, not a function call.
5101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float, sub-float, mul-float, div-float
5103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* floatop vAA, vBB, vCC */
5105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
510938214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
511138214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vCC
5112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r2]                    @ s0<- vBB
5113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fdivs   s2, s0, s1                              @ s2<- op
5116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
5119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_FLOAT: /* 0xaa */
5125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_FLOAT.S */
5126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* EABI doesn't define a float remainder function, but libm does */
5127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop.S */
5128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit binary operation.  Provide an "instr" line that
5130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0 op r1".
5131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.  Note that we
5136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * handles it correctly.
5138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      mul-float, div-float, rem-float
5142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
5144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
5148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vCC
5149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
5150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      fmodf                              @ r0<- op, r0-r3 changed
5158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 11-14 instructions */
5162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_DOUBLE: /* 0xab */
5168968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_ADD_DOUBLE.S */
5169968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide.S */
5170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit double-precision floating point binary operation.
5172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Provide an "instr" line that specifies an instruction that performs
5173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
5174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-double, sub-double, mul-double, div-double
5176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* doubleop vAA, vBB, vCC */
5178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
518238214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
518438214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vCC
5185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r2]                    @ d0<- vBB
5186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    faddd   d2, d0, d1                              @ s2<- op
5189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
5192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_DOUBLE: /* 0xac */
5198968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_SUB_DOUBLE.S */
5199968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide.S */
5200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit double-precision floating point binary operation.
5202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Provide an "instr" line that specifies an instruction that performs
5203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
5204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-double, sub-double, mul-double, div-double
5206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* doubleop vAA, vBB, vCC */
5208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
521238214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
521438214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vCC
5215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r2]                    @ d0<- vBB
5216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsubd   d2, d0, d1                              @ s2<- op
5219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
5222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_DOUBLE: /* 0xad */
5228968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_MUL_DOUBLE.S */
5229968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide.S */
5230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit double-precision floating point binary operation.
5232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Provide an "instr" line that specifies an instruction that performs
5233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
5234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-double, sub-double, mul-double, div-double
5236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* doubleop vAA, vBB, vCC */
5238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
524238214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
524438214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vCC
5245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r2]                    @ d0<- vBB
5246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmuld   d2, d0, d1                              @ s2<- op
5249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
5252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_DOUBLE: /* 0xae */
5258968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_DIV_DOUBLE.S */
5259968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide.S */
5260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit double-precision floating point binary operation.
5262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Provide an "instr" line that specifies an instruction that performs
5263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
5264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-double, sub-double, mul-double, div-double
5266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* doubleop vAA, vBB, vCC */
5268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
527238214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
527438214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vCC
5275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r2]                    @ d0<- vBB
5276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fdivd   d2, d0, d1                              @ s2<- op
5279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
5282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_DOUBLE: /* 0xaf */
5288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_DOUBLE.S */
5289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* EABI doesn't define a double remainder function, but libm does */
5290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide.S */
5291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit binary operation.  Provide an "instr" line that
5293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      xor-long, add-double, sub-double, mul-double, div-double,
5302a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double
5303a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5306a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop vAA, vBB, vCC */
5307a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r0, 1)                        @ r0<- CCBB
5308a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
5309a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r0, #255                @ r2<- BB
5310a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r0, lsr #8              @ r3<- CC
5311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5315a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5316a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5317a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5318a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5319a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5320a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5321a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5322a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5323a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      fmod                              @ result<- op, r0-r3 changed
5324a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5325a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5326a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5327a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 14-17 instructions */
5328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5332a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5333a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_ADD_INT_2ADDR.S */
5335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5346a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5348a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5350a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5355a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5356a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SUB_INT_2ADDR.S */
5375a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5395a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MUL_INT_2ADDR.S */
5415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5433a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5434a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5435a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5436a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5447a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5448a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5449a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5450a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5451a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5452a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5453a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5454a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_DIV_INT_2ADDR.S */
5456a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5476a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
5478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_INT_2ADDR: /* 0xb4 */
5495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_INT_2ADDR.S */
5496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* idivmod returns quotient in r0 and remainder in r1 */
5497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5517a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
5519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r9)               @ vAA<- r1
5528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AND_INT_2ADDR: /* 0xb5 */
5536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AND_INT_2ADDR.S */
5537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5557a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_OR_INT_2ADDR: /* 0xb6 */
5576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_OR_INT_2ADDR.S */
5577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5597a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_XOR_INT_2ADDR.S */
5617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5637a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHL_INT_2ADDR.S */
5657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5677a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
5685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHR_INT_2ADDR.S */
5697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5717a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
5725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_USHR_INT_2ADDR: /* 0xba */
5736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_USHR_INT_2ADDR.S */
5737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
5738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
5741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
5755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
5757a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
5760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
5765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
5768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
5770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
5778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
5791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
5795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    adds    r0, r0, r2                           @ optional op; may set condition codes
5807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
5812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
5820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
5833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
5837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
5843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r0, r0, r2                           @ optional op; may set condition codes
5849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
5854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MUL_LONG_2ADDR.S */
5861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Signed 64-bit integer multiply, "/2addr" version.
5863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * See OP_MUL_LONG for an explanation.
5865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * We get a little tight on registers, so to avoid looking up &fp[A]
5867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * again we stuff it into rINST.
5868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* mul-long/2addr vA, vB */
5870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
5872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mul     ip, r2, r1                  @  ip<- ZxW
5878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_DIV_LONG_2ADDR.S */
5892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
5893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
5906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
5910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
5916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
5927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_LONG_2ADDR: /* 0xbf */
5933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_LONG_2ADDR.S */
5934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
5936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
5949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
5953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
5959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
5961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
5962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
5965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
5968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
5969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
5970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
5973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
5974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
5975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AND_LONG_2ADDR: /* 0xc0 */
5976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AND_LONG_2ADDR.S */
5977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
5978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
5979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
5982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
5983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
5986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
5987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
5991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
5992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
5993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
5994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
5995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
5996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, r2                           @ optional op; may set condition codes
6007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
6012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_OR_LONG_2ADDR.S */
6019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
6020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
6033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
6037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r2                           @ optional op; may set condition codes
6049a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
6054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
6062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
6075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
6079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r0, r0, r2                           @ optional op; may set condition codes
6091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
6096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 32-bit shift distance.
6106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* shl-long/2addr vA, vB */
6108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r3)                    @ r2<- vB
6112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, asl r2              @  r1<- r1 << r2
6117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r3, r2, #32                 @  r3<- 32 - r2
6118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    ip, r2, #32                 @  ip<- r2 - 32
6120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl r2              @  r0<- r0 << r2
6123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_SHL_LONG_2ADDR_finish
6124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 32-bit shift distance.
6132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* shr-long/2addr vA, vB */
6134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r3)                    @ r2<- vB
6138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r3, r2, #32                 @  r3<- 32 - r2
6144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    ip, r2, #32                 @  ip<- r2 - 32
6146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_SHR_LONG_2ADDR_finish
6150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * 32-bit shift distance.
6158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* ushr-long/2addr vA, vB */
6160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r3)                    @ r2<- vB
6164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r3, r2, #32                 @  r3<- 32 - r2
6170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    ip, r2, #32                 @  ip<- r2 - 32
6172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_USHR_LONG_2ADDR_finish
6176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6180968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_ADD_FLOAT_2ADDR.S */
6181968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop2addr.S */
6182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "s2 = s0 op s1".
6186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
619238214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
619438214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vB
6195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r9]                    @ s0<- vA
6198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fadds   s2, s0, s1                              @ s2<- op
6200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
6202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6208968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_SUB_FLOAT_2ADDR.S */
6209968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop2addr.S */
6210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "s2 = s0 op s1".
6214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
622038214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
622238214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vB
6223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r9]                    @ s0<- vA
6226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsubs   s2, s0, s1                              @ s2<- op
6228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
6230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6236968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_MUL_FLOAT_2ADDR.S */
6237968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop2addr.S */
6238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "s2 = s0 op s1".
6242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
624838214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
625038214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vB
6251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r9]                    @ s0<- vA
6254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmuls   s2, s0, s1                              @ s2<- op
6256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
6258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6264968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_DIV_FLOAT_2ADDR.S */
6265968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinop2addr.S */
6266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "s2 = s0 op s1".
6270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
627638214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
627838214bbeeb2980609919978f17b009d896023491Andy McFadden    flds    s1, [r3]                    @ s1<- vB
6279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    flds    s0, [r9]                    @ s0<- vA
6282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fdivs   s2, s0, s1                              @ s2<- op
6284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsts    s2, [r9]                    @ vAA<- s2
6286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* EABI doesn't define a float remainder function, but libm does */
6294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binop2addr.S */
6295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6302a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6303a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6306a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6307a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6308a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6309a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6310a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r3)                    @ r1<- vB
6314a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6315a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6316a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6317a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6318a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6319a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6320a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6321a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
6322a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      fmodf                              @ r0<- op, r0-r3 changed
6323a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6324a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6325a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6326a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6327a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6332a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6333968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_ADD_DOUBLE_2ADDR.S */
6334968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide2addr.S */
6335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
6339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      div-double/2addr
6342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
634638214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
634838214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vB
6349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6350a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r9]                    @ d0<- vA
6352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    faddd   d2, d0, d1                              @ d2<- op
6354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6355a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
6356a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6362968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_SUB_DOUBLE_2ADDR.S */
6363968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide2addr.S */
6364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
6368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      div-double/2addr
6371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
637538214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
637738214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vB
6378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r9]                    @ d0<- vA
6381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fsubd   d2, d0, d1                              @ d2<- op
6383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
6385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6391968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_MUL_DOUBLE_2ADDR.S */
6392968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide2addr.S */
6393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
6397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      div-double/2addr
6400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
640438214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
640638214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vB
6407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r9]                    @ d0<- vA
6410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fmuld   d2, d0, d1                              @ d2<- op
6412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
6414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6420968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/OP_DIV_DOUBLE_2ADDR.S */
6421968d32c2b6160c19c2308793dca6d747cbfea8feAndy McFadden/* File: arm-vfp/fbinopWide2addr.S */
6422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * an "instr" line that specifies an instruction that performs
6425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * "d2 = d0 op d1".
6426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      div-double/2addr
6429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
6432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
643338214bbeeb2980609919978f17b009d896023491Andy McFadden    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6434a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15                 @ r9<- A
643538214bbeeb2980609919978f17b009d896023491Andy McFadden    fldd    d1, [r3]                    @ d1<- vB
6436a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fldd    d0, [r9]                    @ d0<- vA
6439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fdivd   d2, d0, d1                              @ d2<- op
6441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    fstd    d2, [r9]                    @ vAA<- d2
6443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6447a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6448a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6449a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6450a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* EABI doesn't define a double remainder function, but libm does */
6451a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopWide2addr.S */
6452a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6453a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6454a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6456a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-double/2addr
6465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/2addr vA, vB */
6467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
6469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
6481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      fmod                              @ result<- op, r0-r3 changed
6482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 12-15 instructions */
6486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_INT_LIT16: /* 0xd0 */
6492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_ADD_INT_LIT16.S */
6493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_RSUB_INT: /* 0xd1 */
6529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_RSUB_INT.S */
6530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_INT_LIT16: /* 0xd2 */
6567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MUL_INT_LIT16.S */
6568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_INT_LIT16: /* 0xd3 */
6605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_DIV_INT_LIT16.S */
6606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
6626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_INT_LIT16: /* 0xd4 */
6642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_INT_LIT16.S */
6643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* idivmod returns quotient in r0 and remainder in r1 */
6644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
6664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r9)               @ vAA<- r1
6672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AND_INT_LIT16: /* 0xd5 */
6680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AND_INT_LIT16.S */
6681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_OR_INT_LIT16: /* 0xd6 */
6717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_OR_INT_LIT16.S */
6718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_XOR_INT_LIT16: /* 0xd7 */
6754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_XOR_INT_LIT16.S */
6755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit16.S */
6756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit16 vA, vB, #+CCCC */
6769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
6771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- A+
6772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vB
6773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r9, r9, #15
6774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is second operand zero?
6776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-13 instructions */
6785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_ADD_INT_LIT8: /* 0xd8 */
6791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_ADD_INT_LIT8.S */
6792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
6793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
6807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
6809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
6810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
6811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
6814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
6819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
6824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_RSUB_INT_LIT8.S */
6831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
6832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
6846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
6848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
6849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
6850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
6853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
6858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
6863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_MUL_INT_LIT8: /* 0xda */
6869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_MUL_INT_LIT8.S */
6870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
6872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
6886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
6888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
6889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
6890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
6892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
6893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
6898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
6903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_DIV_INT_LIT8: /* 0xdb */
6909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_DIV_INT_LIT8.S */
6910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
6911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
6925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
6927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
6928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
6929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
6931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
6932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
6937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
6940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
6942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_REM_INT_LIT8: /* 0xdc */
6948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_REM_INT_LIT8.S */
6949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* idivmod returns quotient in r0 and remainder in r1 */
6950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
6951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
6964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
6965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
6967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
6968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
6969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 1
6971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
6972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
6973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
6974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
6977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r9)               @ vAA<- r1
6980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
6981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
6982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
6985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
6986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
6987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_AND_INT_LIT8: /* 0xdd */
6988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_AND_INT_LIT8.S */
6989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
6990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
6991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
6993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
6994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
6995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
6998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
6999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
7004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
7007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
7008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
7010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
7011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
7012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
7016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
7019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
7021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_OR_INT_LIT8: /* 0xde */
7027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_OR_INT_LIT8.S */
7028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
7029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
7032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
7033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
7034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
7037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
7043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
7046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
7047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
7049a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
7050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
7051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
7055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
7058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
7060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_XOR_INT_LIT8: /* 0xdf */
7066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_XOR_INT_LIT8.S */
7067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
7068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
7071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
7072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
7073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
7076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
7082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
7085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
7086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
7088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
7089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
7090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                               @ optional op; may set condition codes
7094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
7097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
7099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHL_INT_LIT8: /* 0xe0 */
7105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHL_INT_LIT8.S */
7106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
7107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
7110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
7111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
7112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
7115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
7121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
7124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
7125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
7127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
7128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
7129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
7133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
7136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
7138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_SHR_INT_LIT8: /* 0xe1 */
7144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_SHR_INT_LIT8.S */
7145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
7146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
7149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
7150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
7151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
7154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
7160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
7163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
7164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
7166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
7167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
7168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
7172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
7175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
7177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_USHR_INT_LIT8: /* 0xe2 */
7183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_USHR_INT_LIT8.S */
7184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/binopLit8.S */
7185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * that specifies an instruction that performs "result = r0 op r1".
7188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * This could be an ARM instruction or a function call.  (If the result
7189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * comes back in a register other than r0, you can override "result".)
7190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * vCC (r1).  Useful for integer division and modulus.
7193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* binop/lit8 vAA, vBB, #+CC */
7199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r3, #255                @ r2<- BB
7202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- vBB
7203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if 0
7205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @cmp     r1, #0                      @ is second operand zero?
7206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errDivideByZero
7207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #31                           @ optional op; may set condition codes
7211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)               @ vAA<- r0
7214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* 10-12 instructions */
7216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_E3: /* 0xe3 */
7222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_E3.S */
7223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_E4: /* 0xe4 */
7231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_E4.S */
7232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_E5: /* 0xe5 */
7240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_E5.S */
7241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_E6: /* 0xe6 */
7249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_E6.S */
7250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_E7: /* 0xe7 */
7258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_E7.S */
7259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
72665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
72675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
72685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE.S */
72695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
72705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Wide 32-bit instance field get.
72715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
72725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iget-wide vA, vB, field@CCCC */
72735387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
72745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
72755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
72765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
72775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
72785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
72795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
72805387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
72815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
72825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
72835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
72845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
72855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0
72865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish
72875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
72925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
72935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
72945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE.S */
72955387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iput-wide vA, vB, field@CCCC */
72965387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
72975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [rGLUE, #offGlue_methodClassDex]    @ r3<- DvmDex
72985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
72995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
73005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
73015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
73025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
73035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
73045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden8:  ldr     r2, [rGLUE, #offGlue_method] @ r2<- current method
73055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
73065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
73075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
73085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
73095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
73105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
73155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
73165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
73175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE.S */
73185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
73195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SGET handler.
73205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
73215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sget-wide vAA, field@BBBB */
73225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_methodClassDex]    @ r2<- DvmDex
73235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
73245387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
73255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
73265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
73275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
73285387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_finish:
7329861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7330861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7331861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7332861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
7333861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7334861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7335861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7336861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
73375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7338861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
73395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
73405387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
73455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
73465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
73475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE.S */
73485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
73495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SPUT handler.
73505387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
73515387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sput-wide vAA, field@BBBB */
7352861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [rGLUE, #offGlue_methodClassDex]  @ r0<- DvmDex
73535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
7354861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
73555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7356861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldr     r2, [r0, r1, lsl #2]        @ r2<- resolved StaticField ptr
73575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7358861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
73595387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7360861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
73615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7362861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7363861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7364861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7365861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7366861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
7367861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7368861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7369861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7370861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
7371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
737596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
737696516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: armv5te/OP_BREAKPOINT.S */
7377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
7386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle a throw-verification-error instruction.  This throws an
7388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * exception for an error discovered during verification.  The
7389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * exception is indicated by AA, with some detail provided by BBBB.
7390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op AA, ref@BBBB */
7392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
7393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r2, 1)                        @ r2<- BBBB
7394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ export the PC
7395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #8           @ r1<- AA
7396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowVerificationError   @ always throws
7397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ handle exception
7398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_EXECUTE_INLINE: /* 0xee */
7403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE.S */
7404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Execute a "native inline" instruction.
7406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7407b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7408b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7410b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7411b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7412b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 1)                       @ r10<- BBBB
7416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ can throw
7418b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
7420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [sp]                    @ push &glue->retval
7421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     sp, sp, #8                  @ pop stack
7423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ test boolean result of inline
7424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ returned false, handle exception
7425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7431b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7432b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7433b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
7434b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Execute a "native inline" instruction, using "/range" semantics.
7435b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Same idea as execute-inline, but we get the args differently.
7436b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7437b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7438b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7439b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7440b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7441b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7442b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7443b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
7444b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7445b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r10, 1)                       @ r10<- BBBB
7446b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     r1, rGLUE, #offGlue_retval  @ r1<- &glue->retval
7447b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    EXPORT_PC()                         @ can throw
7448b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7449b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
7450b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    str     r1, [sp]                    @ push &glue->retval
7451b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7452b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     sp, sp, #8                  @ pop stack
7453b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    cmp     r0, #0                      @ test boolean result of inline
7454b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    beq     common_exceptionThrown      @ returned false, handle exception
7455b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7456b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7457b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */
7462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_DIRECT_EMPTY.S */
7463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * invoke-direct-empty is a no-op in a "standard" interpreter.
7465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
7467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute it
7469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_F1: /* 0xf1 */
7473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_F1.S */
7474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_QUICK: /* 0xf2 */
7482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_QUICK.S */
7483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* For: iget-quick, iget-object-quick */
7484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, offset@CCCC */
7485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
7486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field byte offset
7488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ check object for null
7489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A(+)
7490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
7491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15
7494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
7496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* iget-wide-quick vA, vB, offset@CCCC */
7504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
7505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field byte offset
7507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ check object for null
7508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A(+)
7509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
7510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrd    r0, [r3, r1]                @ r0<- obj.field (64 bits, aligned)
7511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15
7512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IGET_QUICK.S */
7524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* For: iget-quick, iget-object-quick */
7525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, offset@CCCC */
7526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
7527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field byte offset
7529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ check object for null
7530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A(+)
7531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
7532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15
7535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
7537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_QUICK: /* 0xf5 */
7544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_QUICK.S */
7545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* For: iput-quick, iput-object-quick */
7546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, offset@CCCC */
7547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
7548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field byte offset
7550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ check object for null
7551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A(+)
7552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
7553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15
7554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- fp[A]
7555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* iput-wide-quick vA, vB, offset@CCCC */
7566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- A(+)
7567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #12          @ r1<- B
7568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r0, r0, #15
7569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ check object for null
7572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
7574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r3, 1)                        @ r3<- field byte offset
7575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7583a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7584a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_IPUT_QUICK.S */
7586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* For: iput-quick, iput-object-quick */
7587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vA, vB, offset@CCCC */
7588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #12          @ r2<- B
7589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- field byte offset
7591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ check object for null
7592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A(+)
7593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
7594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15
7595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r2)                    @ r0<- fp[A]
7596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle an optimized virtual method call.
7609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
7616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!0)
7617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ is "this" null?
7621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ null "this", throw exception
7622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ invoke must export
7625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodNoRange @ continue on
7627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle an optimized virtual method call.
7635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
7642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!1)
7643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r3)                    @ r2<- vC ("this" ptr)
7646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ is "this" null?
7647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ null "this", throw exception
7648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offObject_clazz]  @ r2<- thisPtr->clazz
7649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ invoke must export
7651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodRange @ continue on
7653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle an optimized "super" method call.
7661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: [opt] invoke-super-quick, invoke-super-quick/range
7663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!0)
7669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
7672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
7674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r10)                   @ r3<- "this"
7676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ null "this" ref?
7678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ "this" is null, throw exception
7680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodNoRange @ continue on
7681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Handle an optimized "super" method call.
7690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * for: [opt] invoke-super-quick, invoke-super-quick/range
7692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
7697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!1)
7698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
7700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 1)                        @ r1<- BBBB
7701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
7703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r10)                   @ r3<- "this"
7705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ null "this" ref?
7707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ "this" is null, throw exception
7709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodRange @ continue on
7710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_FC: /* 0xfc */
7716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_FC.S */
7717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_FD: /* 0xfd */
7725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_FD.S */
7726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_FE: /* 0xfe */
7734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_FE.S */
7735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* ------------------------------ */
7741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_OP_UNUSED_FF: /* 0xff */
7743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/OP_UNUSED_FF.S */
7744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/unused.S */
7745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort
7746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 64
7751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
7752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .global dvmAsmInstructionEnd
7753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendvmAsmInstructionEnd:
7754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
7756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * ===========================================================================
7757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  Sister implementations
7758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * ===========================================================================
7759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
7760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .global dvmAsmSisterStart
7761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .type   dvmAsmSisterStart, %function
7762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .text
7763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 4
7764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendvmAsmSisterStart:
7765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CONST_STRING */
7767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the String has not yet been resolved.
7770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB (String ref)
7771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9: target register
7772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CONST_STRING_resolve:
7774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
7775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
7776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveString            @ r0<- String reference
7778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
7779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yup, handle the exception
7780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
7783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CONST_STRING_JUMBO */
7787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the String has not yet been resolved.
7790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBBBBBB (String ref)
7791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9: target register
7792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CONST_STRING_JUMBO_resolve:
7794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
7795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
7796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveString            @ r0<- String reference
7798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
7799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yup, handle the exception
7800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
7803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CONST_CLASS */
7807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the Class has not yet been resolved.
7810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB (Class ref)
7811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9: target register
7812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CONST_CLASS_resolve:
7814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
7815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_method] @ r0<- glue->method
7816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #1                      @ r2<- true
7817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveClass             @ r0<- Class reference
7819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
7820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yup, handle the exception
7821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
7824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CHECK_CAST */
7828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Trivial test failed, need to perform full check.  This is common.
7831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds obj->clazz
7832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 holds class resolved from BBBB
7833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
7834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CHECK_CAST_fullcheck:
7836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
7837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
7838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_CHECK_CAST_okay            @ no, success
7839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ A cast has failed.  We need to throw a ClassCastException with the
7841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ class of the object that failed to be cast.
7842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ about to throw
7843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r9, #offObject_clazz]  @ r3<- obj->clazz
7844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, .LstrClassCastExceptionPtr
7845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r3, #offClassObject_descriptor] @ r1<- obj->clazz->descriptor
7846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowExceptionWithClassMessage
7847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
7848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Resolution required.  This is the least-likely path.
7851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r2 holds BBBB
7853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
7854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CHECK_CAST_resolve:
7856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
7857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
7858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r2                      @ r1<- BBBB
7859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #0                      @ r2<- false
7860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
7862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
7863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle exception
7864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r0                      @ r1<- class resolved from BBB
7865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
7866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
7867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrClassCastExceptionPtr:
7869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrClassCastException
7870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_INSTANCE_OF */
7873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Trivial test failed, need to perform full check.  This is common.
7876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds obj->clazz
7877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 holds class resolved from BBBB
7878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds A
7879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INSTANCE_OF_fullcheck:
7881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
7882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ fall through to OP_INSTANCE_OF_store
7883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * r0 holds boolean result
7886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * r9 holds A
7887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INSTANCE_OF_store:
7889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vA<- r0
7891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Trivial test succeeded, save and bail.
7896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds A
7897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INSTANCE_OF_trivial:
7899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #1                      @ indicate success
7900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
7901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vA<- r0
7903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Resolution required.  This is the least-likely path.
7908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r3 holds BBBB
7910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds A
7911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INSTANCE_OF_resolve:
7913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw
7914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]    @ r0<- glue->method
7915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r3                      @ r1<- BBBB
7916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #1                      @ r2<- true
7917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
7918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
7919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
7920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle exception
7921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r0                      @ r1<- class resolved from BBB
7922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #12          @ r3<- B
7923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r3)                    @ r0<- vB (object)
7924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
7925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
7926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_NEW_INSTANCE */
7929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .balign 32                          @ minimize cache lines
7931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_NEW_INSTANCE_finish: @ r0=new object
7932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ r3<- AA
7933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
7934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle the exception
7935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r3)                    @ vAA<- r0
7938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Class initialization required.
7942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds class object
7944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_NEW_INSTANCE_needinit:
7946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, r0                      @ save r0
7947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmInitClass                @ initialize class
7948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ check boolean result
7949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r9                      @ restore r0
7950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
7951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ failed, deal with init exception
7952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Resolution required.  This is the least-likely path.
7955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 holds BBBB
7957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_NEW_INSTANCE_resolve:
7959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
7960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #0                      @ r2<- false
7961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
7963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
7964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
7965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
7966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrInstantiationErrorPtr:
7968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrInstantiationError
7969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_NEW_ARRAY */
7972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Resolve class.  (This is an uncommon case.)
7976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 holds array length
7978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r2 holds class ref CCCC
7979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_NEW_ARRAY_resolve:
7981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
7982a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, r1                      @ r9<- length (save)
7983a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r2                      @ r1<- CCCC
7984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #0                      @ r2<- false
7985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveClass             @ r0<- call(clazz, ref)
7987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
7988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r9                      @ r1<- length (restore)
7989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle exception
7990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ fall through to OP_NEW_ARRAY_finish
7991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
7992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
7993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Finish allocation.
7994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
7995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds class
7996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 holds array length
7997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
7998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_NEW_ARRAY_finish:
7999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
8000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
8001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ failed?
8002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ yes, handle the exception
8004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ vA<- r0
8008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_FILLED_NEW_ARRAY */
8012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * On entry:
8015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds array class
8016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 holds AA or BA
8017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_FILLED_NEW_ARRAY_continue:
8019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     0
8023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10                     @ r1<- AA (length)
8024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .else
8025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10, lsr #4             @ r1<- B (length)
8026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
8027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #'I'                    @ array of ints?
8028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmpne   r3, #'L'                    @ array of objects?
8029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmpne   r3, #'['                    @ array of arrays?
8030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, r1                      @ save length in r9
8031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
8032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null return?
8034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ alloc failed, handle exception
8035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r9, r9, #1                  @ length--, check for neg
8040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     2f                          @ was zero, bail
8042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ copy values from registers into the array
8044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     0
8046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:  ldr     r3, [r2], #4                @ r3<- *r2++
8048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r9, r9, #1                  @ count--
8049a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [r0], #4                @ *contents++ = vX
8050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bpl     1b
8051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ continue at 2
8052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .else
8053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #4                      @ length was initially 5?
8054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r10, #15                @ r2<- A
8055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     1f                          @ <= 4 args, branch
8056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- vA
8057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r9, r9, #1                  @ count--
8058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [r0, #16]               @ contents[4] = vA
8059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r9, r9, #1                  @ count--
8063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [r0], #4                @ *contents++ = vX
8064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bpl     1b
8065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ continue at 2
8066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
8067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden2:
8069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute it
8071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Throw an exception indicating that we have not implemented this
8074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * mode of filled-new-array.
8075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_FILLED_NEW_ARRAY_notimpl:
8077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, .L_strInternalError
8078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, .L_strFilledNewArrayNotImpl
8079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
8080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
8081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!0)                 @ define in one or the other, not both
8083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_strFilledNewArrayNotImpl:
8084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrFilledNewArrayNotImpl
8085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_strInternalError:
8086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrInternalError
8087a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
8088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
8091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * On entry:
8094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds array class
8095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 holds AA or BA
8096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_FILLED_NEW_ARRAY_RANGE_continue:
8098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrb    r3, [r3, #1]                @ r3<- descriptor[1]
8101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     1
8102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10                     @ r1<- AA (length)
8103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .else
8104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10, lsr #4             @ r1<- B (length)
8105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
8106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #'I'                    @ array of ints?
8107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmpne   r3, #'L'                    @ array of objects?
8108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmpne   r3, #'['                    @ array of arrays?
8109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, r1                      @ save length in r9
8110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
8111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ null return?
8113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_exceptionThrown      @ alloc failed, handle exception
8114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [rGLUE, #offGlue_retval]    @ retval.l <- new array
8117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r9, r9, #1                  @ length--, check for neg
8119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     2f                          @ was zero, bail
8121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ copy values from registers into the array
8123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     1
8125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:  ldr     r3, [r2], #4                @ r3<- *r2++
8127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r9, r9, #1                  @ count--
8128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [r0], #4                @ *contents++ = vX
8129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bpl     1b
8130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ continue at 2
8131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .else
8132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #4                      @ length was initially 5?
8133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r10, #15                @ r2<- A
8134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     1f                          @ <= 4 args, branch
8135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- vA
8136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r9, r9, #1                  @ count--
8137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [r0, #16]               @ contents[4] = vA
8138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r9, r9, #1                  @ count--
8142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [r0], #4                @ *contents++ = vX
8143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bpl     1b
8144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ continue at 2
8145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
8146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden2:
8148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
8149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ execute it
8150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Throw an exception indicating that we have not implemented this
8153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * mode of filled-new-array.
8154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
8156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, .L_strInternalError
8157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, .L_strFilledNewArrayNotImpl
8158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
8159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
8160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     (!1)                 @ define in one or the other, not both
8162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_strFilledNewArrayNotImpl:
8163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrFilledNewArrayNotImpl
8164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.L_strInternalError:
8165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrInternalError
8166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
8167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CMPL_FLOAT */
8170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CMPL_FLOAT_finish:
8171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
8172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CMPG_FLOAT */
8176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CMPG_FLOAT_finish:
8177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
8178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CMPL_DOUBLE */
8182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CMPL_DOUBLE_finish:
8183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
8184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CMPG_DOUBLE */
8188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CMPG_DOUBLE_finish:
8189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r9)                    @ vAA<- r0
8190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_CMP_LONG */
8194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CMP_LONG_less:
8196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvn     r1, #0                      @ r1<- -1
8197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ Want to cond code the next mov so we can avoid branch, but don't see it;
8198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ instead, we just replicate the tail end.
8199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r9)                    @ vAA<- r1
8201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CMP_LONG_greater:
8205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #1                      @ r1<- 1
8206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ fall through to _finish
8207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_CMP_LONG_finish:
8209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r1, r9)                    @ vAA<- r1
8211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_AGET_WIDE */
8216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_AGET_WIDE_finish:
8218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
8221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
8223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_APUT_WIDE */
8227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_APUT_WIDE_finish:
8229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
8231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_APUT_OBJECT */
8237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * On entry:
8239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 = vBB (arrayObj)
8240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 = vAA (obj)
8241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 = offset into array (vBB + vCC * width)
8242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_APUT_OBJECT_finish:
8244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ storing null reference?
8245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
8246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r1, #offObject_clazz]  @ r1<- arrayObj->clazz
8248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmCanPutArrayElement       @ test object type vs. array type
8249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ okay?
8250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errArrayStore        @ no
8251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_APUT_OBJECT_skip_check:
8252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
8255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IGET */
8259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IGET_finish:
8266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak0
8267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
8276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IGET_WIDE */
8280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IGET_WIDE_finish:
8287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8290861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
8291861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
8292861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
8293861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
8295861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8296861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8298861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
8299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
8300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
8302a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8303a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8304a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8305a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IGET_OBJECT */
8306a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8307a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8308a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8309a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8310a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8311a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8312a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IGET_OBJECT_finish:
8313a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak0
8314a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8315a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8316a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8317a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8318a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8319a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8320a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8321a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8322a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
8323a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8324a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8325a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8326a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IGET_BOOLEAN */
8327a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8328a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8329a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8330a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8331a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8332a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8333a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IGET_BOOLEAN_finish:
8334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak1
8335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
8344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8346a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IGET_BYTE */
8348a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8350a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IGET_BYTE_finish:
8355a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak2
8356a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
8365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IGET_CHAR */
8369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8375a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IGET_CHAR_finish:
8376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak3
8377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
8386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IGET_SHORT */
8390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IGET_SHORT_finish:
8397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak4
8398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SET_VREG(r0, r2)                    @ fp[A]<- r0
8407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IPUT */
8411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IPUT_finish:
8418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak0
8419a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
8420a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8421a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #15                 @ r1<- A
8422a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8423a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
8424a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8425a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8426a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8427a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8428a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8429a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8430a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8431a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IPUT_WIDE */
8432a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8433a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8434a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8435a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8436a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8437a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8438a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IPUT_WIDE_finish:
8439a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
8440a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8441a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r2, r2, #15                 @ r2<- A
8442a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8443a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
8444a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8445a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8446a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
8447861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8448861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
8449861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- target address
8450861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
8451861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
8452861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
8453861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
8454861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
8455a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8456a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8457a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IPUT_OBJECT */
8458a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8459a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8460a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8461a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8462a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8463a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8464a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IPUT_OBJECT_finish:
8465a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak0
8466a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
8467a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8468a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #15                 @ r1<- A
8469a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8470a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
8471a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8472a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8473a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8474a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8475a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8476a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8477a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8478a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IPUT_BOOLEAN */
8479a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8480a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8481a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8482a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8483a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8484a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8485a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IPUT_BOOLEAN_finish:
8486a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak1
8487a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
8488a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8489a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #15                 @ r1<- A
8490a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8491a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
8492a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8493a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8494a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8495a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8496a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8497a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8498a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8499a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IPUT_BYTE */
8500a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8501a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8502a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8503a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8504a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8505a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8506a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IPUT_BYTE_finish:
8507a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak2
8508a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
8509a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8510a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #15                 @ r1<- A
8511a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8512a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
8513a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8514a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8515a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8516a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8517a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8518a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8519a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8520a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IPUT_CHAR */
8521a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8522a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8523a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8524a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8525a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8526a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8527a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IPUT_CHAR_finish:
8528a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak3
8529a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
8530a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8531a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #15                 @ r1<- A
8532a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8533a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
8534a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8535a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8536a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8537a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8538a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8539a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8540a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8541a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_IPUT_SHORT */
8542a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8543a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8544a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Currently:
8545a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 holds resolved field
8546a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 holds object
8547a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8548a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_IPUT_SHORT_finish:
8549a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_squeak4
8550a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, rINST, lsr #8           @ r1<- A+
8551a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8552a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    and     r1, r1, #15                 @ r1<- A
8553a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r9, #0                      @ check object for null
8554a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r0, r1)                    @ r0<- fp[A]
8555a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ object was null
8556a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8557a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8558a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8559a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
8560a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8561a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8562a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SGET */
8563a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8564a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8565a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8566a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8567a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8568a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_resolve:
8569a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8570a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8571a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8572a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8573a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8574a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SGET_finish          @ yes, finish
8575a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8576a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8577a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8578a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SGET_WIDE */
8579a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8580a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8581a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8582a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8583861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
8584861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
8585a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8586a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_WIDE_resolve:
8587a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8588a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8589a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8590a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8591a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8592a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SGET_WIDE_finish          @ yes, finish
8593a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8594a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8595a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8596a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SGET_OBJECT */
8597a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8598a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_OBJECT_resolve:
8603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8608a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SGET_OBJECT_finish          @ yes, finish
8609a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8610a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8611a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8612a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SGET_BOOLEAN */
8613a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8614a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8615a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_BOOLEAN_resolve:
8619a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SGET_BOOLEAN_finish          @ yes, finish
8625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SGET_BYTE */
8629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_BYTE_resolve:
8635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8638a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8639a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8640a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SGET_BYTE_finish          @ yes, finish
8641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SGET_CHAR */
8645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_CHAR_resolve:
8651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SGET_CHAR_finish          @ yes, finish
8657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SGET_SHORT */
8661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SGET_SHORT_resolve:
8667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SGET_SHORT_finish          @ yes, finish
8673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8675a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8676a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SPUT */
8677a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8678a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8679a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8680a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8682a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_resolve:
8683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8684a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8685a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8686a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8687a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8688a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SPUT_finish          @ yes, finish
8689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SPUT_WIDE */
8693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9: &fp[AA]
8698861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
8699861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
8700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_WIDE_resolve:
8702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8707861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
8708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SPUT_WIDE_finish          @ yes, finish
8709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SPUT_OBJECT */
8713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_OBJECT_resolve:
8719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SPUT_OBJECT_finish          @ yes, finish
8725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SPUT_BOOLEAN */
8729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_BOOLEAN_resolve:
8735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SPUT_BOOLEAN_finish          @ yes, finish
8741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SPUT_BYTE */
8745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_BYTE_resolve:
8751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SPUT_BYTE_finish          @ yes, finish
8757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SPUT_CHAR */
8761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_CHAR_resolve:
8767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SPUT_CHAR_finish          @ yes, finish
8773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SPUT_SHORT */
8777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Continuation if the field has not yet been resolved.
8780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1: BBBB field ref
8781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SPUT_SHORT_resolve:
8783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
8784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
8785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
8787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ success?
8788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_SPUT_SHORT_finish          @ yes, finish
8789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ no, handle exception
8790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_INVOKE_VIRTUAL */
8793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * At this point:
8796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 = resolved base method
8797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
8798a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_VIRTUAL_continue:
8800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r10)                   @ r1<- "this" ptr
8801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
8802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is "this" null?
8803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ null "this", throw exception
8804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
8805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
8806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
8807a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodNoRange @ continue on
8808a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8809a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8810a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_INVOKE_SUPER */
8811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * At this point:
8814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 = resolved base method
8815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 = method->clazz
8816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_SUPER_continue:
8818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
8819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
8820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
8821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
8822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
8823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
8824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
8825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
8826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodNoRange @ continue on
8827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_SUPER_resolve:
8829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r9                      @ r0<- method->clazz
8830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_VIRTUAL         @ resolver method type
8831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
8833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
8834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
8835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Throw a NoSuchMethodError with the method name as the message.
8838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 = resolved base method
8839a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8840a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_SUPER_nsm:
8841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
8842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_errNoSuchMethod
8843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8845a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_INVOKE_DIRECT */
8846a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8848a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * On entry:
8849a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 = reference (BBBB or CCCC)
8850a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 = "this" register
8851a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8852a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_DIRECT_resolve:
8853a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8854a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_DIRECT          @ resolver method type
8856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
8858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
8859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
8860a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
8861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8862a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_INVOKE_VIRTUAL_RANGE */
8864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * At this point:
8867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 = resolved base method
8868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
8869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_VIRTUAL_RANGE_continue:
8871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r1, r10)                   @ r1<- "this" ptr
8872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
8873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ is "this" null?
8874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_errNullObject        @ null "this", throw exception
8875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r1, #offObject_clazz]  @ r1<- thisPtr->clazz
8876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
8877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
8878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodRange @ continue on
8879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_INVOKE_SUPER_RANGE */
8882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8884a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * At this point:
8885a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 = resolved base method
8886a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 = method->clazz
8887a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_SUPER_RANGE_continue:
8889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r9, #offClassObject_super]     @ r1<- method->clazz->super
8890a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
8891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
8892a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ must export for invoke
8893a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
8894a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
8895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
8896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
8897a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_invokeMethodRange @ continue on
8898a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8899a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_SUPER_RANGE_resolve:
8900a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r9                      @ r0<- method->clazz
8901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_VIRTUAL         @ resolver method type
8902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
8904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
8905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
8906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8907a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8908a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Throw a NoSuchMethodError with the method name as the message.
8909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 = resolved base method
8910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_SUPER_RANGE_nsm:
8912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
8913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_errNoSuchMethod
8914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_INVOKE_DIRECT_RANGE */
8917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
8919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * On entry:
8920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r1 = reference (BBBB or CCCC)
8921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 = "this" register
8922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
8923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_INVOKE_DIRECT_RANGE_resolve:
8924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_method] @ r3<- glue->method
8925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, #METHOD_DIRECT          @ resolver method type
8927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ got null?
8929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_VREG(r2, r10)                   @ r2<- "this" ptr (reload)
8930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
8931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown      @ yes, handle exception
8932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_FLOAT_TO_LONG */
8935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
8936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert the float in r0 to a long in r0/r1.
8937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
8938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * We have to clip values to long min/max per the specification.  The
8939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * expected common case is a "reasonable" value that converts directly
8940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * to modest integer.  The EABI convert function isn't doing this for us.
8941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
8942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenf2l_doconv:
8943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r4, lr}
8944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0x5f000000             @ (float)maxlong
8945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r4, r0
8946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_fcmpge              @ is arg >= maxlong?
8947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ nonzero == yes
8948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvnne   r0, #0                      @ return maxlong (7fffffff)
8949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvnne   r1, #0x80000000
8950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmnefd sp!, {r4, pc}
8951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r4                      @ recover arg
8953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0xdf000000             @ (float)minlong
8954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_fcmple              @ is arg <= minlong?
8955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ nonzero == yes
8956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movne   r0, #0                      @ return minlong (80000000)
8957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movne   r1, #0x80000000
8958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmnefd sp!, {r4, pc}
8959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r4                      @ recover arg
8961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r4
8962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_fcmpeq              @ is arg == self?
8963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ zero == no
8964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    moveq   r1, #0                      @ return zero for NaN
8965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmeqfd sp!, {r4, pc}
8966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r4                      @ recover arg
8968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_f2lz                @ convert float to long
8969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r4, pc}
8970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8971a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8972a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_DOUBLE_TO_LONG */
8973a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
8974a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert the double in r0/r1 to a long in r0/r1.
8975a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
8976a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * We have to clip values to long min/max per the specification.  The
8977a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * expected common case is a "reasonable" value that converts directly
8978a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * to modest integer.  The EABI convert function isn't doing this for us.
8979a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
8980a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddend2l_doconv:
8981a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r4, r5, lr}           @ save regs
89825162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0x43000000             @ maxlong, as a double (high word)
89835162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0x43e00000
89845162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ maxlong, as a double (low word)
8985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     sp, sp, #4                  @ align for EABI
89865162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
8987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r5, r1                      @  and r1
8988a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_dcmpge              @ is arg >= maxlong?
8989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ nonzero == yes
8990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
8991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mvnne   r1, #0x80000000
8992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     1f
8993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
8994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r4                      @ recover arg
8995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r5
89965162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc3000000             @ minlong, as a double (high word)
89975162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, #0x00e00000             @  0xc3e00000
89985162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minlong, as a double (low word)
8999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_dcmple              @ is arg <= minlong?
9000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ nonzero == yes
9001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movne   r0, #0                      @ return minlong (8000000000000000)
9002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movne   r1, #0x80000000
9003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     1f
9004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r4                      @ recover arg
9006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r5
9007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, r4                      @ compare against self
9008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r5
9009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_dcmpeq              @ is arg == self?
9010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ zero == no
9011a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    moveq   r1, #0                      @ return zero for NaN
9012a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     1f
9013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r4                      @ recover arg
9015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r5
9016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __aeabi_d2lz                @ convert double to long
9017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:
9019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     sp, sp, #4
9020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r4, r5, pc}
9021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_MUL_LONG */
9024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_MUL_LONG_finish:
9026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
9028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SHL_LONG */
9032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SHL_LONG_finish:
9034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0, asl r2              @  r0<- r0 << r2
9035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SHR_LONG */
9041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SHR_LONG_finish:
9043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, asr r2              @  r1<- r1 >> r2
9044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9049a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_USHR_LONG */
9050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_USHR_LONG_finish:
9052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
9053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SHL_LONG_2ADDR */
9059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SHL_LONG_2ADDR_finish:
9061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_SHR_LONG_2ADDR */
9067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_SHR_LONG_2ADDR_finish:
9069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_USHR_LONG_2ADDR */
9075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_USHR_LONG_2ADDR_finish:
9077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
90825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IGET_WIDE_VOLATILE */
90835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
90845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
90855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
90865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
90875387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
90885387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
90895387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IGET_WIDE_VOLATILE_finish:
90905387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
90915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
90925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
9093861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
9094861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r9, r3                  @ r0<- address of field
9095861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_read_64 @ r0/r1<- contents of field
9096861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
90975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
9098861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
9099861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
91005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9101861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    and     r2, r2, #15                 @ r2<- A
91025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
91035387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
91045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
91055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
91065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_IPUT_WIDE_VOLATILE */
91095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91105387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
91115387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Currently:
91125387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r0 holds resolved field
91135387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9 holds object
91145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
91155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_IPUT_WIDE_VOLATILE_finish:
91165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- A+
91175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r9, #0                      @ check object for null
91185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    and     r2, r2, #15                 @ r2<- A
91195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
91205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
91215387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     common_errNullObject        @ object was null
91225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
91235387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
9124861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
9125861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
9126861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r9, r3                  @ r2<- target address
9127861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    bl      android_quasiatomic_swap_64 @ stores r0/r1 into addr r2
9128861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
9129861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
9130861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
9131861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
91325387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91335387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91345387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SGET_WIDE_VOLATILE */
91355387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
91375387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
91385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
9139861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9140861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r0.
91415387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
91425387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_resolve:
91435387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
91445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
91455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
91465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
91475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
91485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SGET_WIDE_VOLATILE_finish          @ yes, finish
91495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
91505387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91515387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91525387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* continuation for OP_SPUT_WIDE_VOLATILE */
91535387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
91555387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Continuation if the field has not yet been resolved.
91565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r1: BBBB field ref
91575387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     *  r9: &fp[AA]
9158861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     *
9159861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden     * Returns StaticField pointer in r2.
91605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
91615387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SPUT_WIDE_VOLATILE_resolve:
91625387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [rGLUE, #offGlue_method]    @ r2<- current method
91635387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw, so export now
91645387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
91655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
91665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
9167861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r2, r0                      @ copy to r2
91685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_SPUT_WIDE_VOLATILE_finish          @ yes, finish
91695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown      @ no, handle exception
91705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
91715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden
9172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* continuation for OP_EXECUTE_INLINE */
9173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
9175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Extract args, call function.
9176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 = #of args (0-4)
9177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r10 = call index
9178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
9180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Other ideas:
9181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * - Use a jump table from the main piece to jump directly into the
9182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *   AND/LDR pairs.  Costs a data load, saves a branch.
9183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * - Have five separate pieces that do the loading, so we can work the
9184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *   interleave a little better.  Increases code size.
9185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
9186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_EXECUTE_INLINE_continue:
9187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r0, r0, #4                  @ r0<- 4-r0
9188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r9, 2)                        @ r9<- FEDC
9189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort                @ (skipped due to ARM prefetch)
9191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden4:  and     ip, r9, #0xf000             @ isolate F
9192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
9193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden3:  and     ip, r9, #0x0f00             @ isolate E
9194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
9195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden2:  and     ip, r9, #0x00f0             @ isolate D
9196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
9197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:  and     ip, r9, #0x000f             @ isolate C
9198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
9199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden0:
9200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, .LOP_EXECUTE_INLINE_table       @ table of InlineOperation
9201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ (not reached)
9203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LOP_EXECUTE_INLINE_table:
9205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   gDvmInlineOpsTable
9206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9208b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* continuation for OP_EXECUTE_INLINE_RANGE */
9209b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9210b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
9211b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Extract args, call function.
9212b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r0 = #of args (0-4)
9213b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  r10 = call index
9214b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9215b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
9216b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_continue:
9217b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    rsb     r0, r0, #4                  @ r0<- 4-r0
9218b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r9, 2)                        @ r9<- CCCC
9219b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9220b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      common_abort                @ (skipped due to ARM prefetch)
9221b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden4:  add     ip, r9, #3                  @ base+3
9222b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r3, ip)                    @ r3<- vBase[3]
9223b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden3:  add     ip, r9, #2                  @ base+2
9224b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r2, ip)                    @ r2<- vBase[2]
9225b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden2:  add     ip, r9, #1                  @ base+1
9226b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r1, ip)                    @ r1<- vBase[1]
9227b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden1:  add     ip, r9, #0                  @ (nop)
9228b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_VREG(r0, ip)                    @ r0<- vBase[0]
9229b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden0:
9230b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
9231b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    LDR_PC  "[r9, r10, lsl #4]"         @ sizeof=16, "func" is first entry
9232b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    @ (not reached)
9233b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9234b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.LOP_EXECUTE_INLINE_RANGE_table:
9235b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    .word   gDvmInlineOpsTable
9236b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9237b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden
9238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
9239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .global dvmAsmSisterEnd
9240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendvmAsmSisterEnd:
9241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/* File: armv5te/footer.S */
9243ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * ===========================================================================
9246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  Common subroutines and data
9247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * ===========================================================================
9248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
9249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .text
9253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .align  2
9254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
925697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
925797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpPunt
925897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpPunt:
9259d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
926097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
9261d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9262d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9263d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
926497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
926597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpSingleStep
926697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpSingleStep:
9267d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    lr,[rGLUE,#offGlue_jitResumeNPC]
9268d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r1,[rGLUE,#offGlue_jitResumeDPC]
926997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
9270d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
927197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
927240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
927340094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
9274d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
927540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC                       @ pass our target PC
927640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
9277d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9278d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9279d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
928040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng
928140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
928240094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
9283d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
92849a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
928597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
9286d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9287d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9288d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
928997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
929040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpBackwardBranch
929140094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpBackwardBranch:
9292d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
92939a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
929497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
9295d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9296d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9297d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
929897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
929997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNormal
930097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNormal:
9301d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
93029a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
930397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
9304d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9305d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9306d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
930797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
930897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNoChain
930997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNoChain:
9310d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
931197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r0,rPC                       @ pass our target PC
931297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
9313d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
9314d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r3, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9315d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
931697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
9317ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9318ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter when the compiler is
9319ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * having issues translating/executing a Dalvik instruction. We have to skip
9320ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the code cache lookup otherwise it is possible to indefinitely bouce
9321ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * between the interpreter and the code cache if the instruction that fails
9322ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to be compiled happens to be at a trace start.
9323ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9324ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpPunt
9325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpPunt:
93267a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
9327ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC, r0
932886717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
9329ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,lr
9330ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpPunt;
9331ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9332ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
93337a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov    r0, #0
93347a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ Back to the interp land
9335ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9336ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9337ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9338ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9339ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9340ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9341ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return to the interpreter to handle a single instruction.
9342ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * On entry:
9343ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r0 <= PC
9344ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    r1 <= PC of resume instruction
9345ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    lr <= resume point in translation
9346ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9347ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpSingleStep
9348ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpSingleStep:
9349d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    lr,[rGLUE,#offGlue_jitResumeNPC]
9350d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    str    r1,[rGLUE,#offGlue_jitResumeDPC]
9351ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#kInterpEntryInstr
9352ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ enum is 4 byte in aapcs-EABI
9353ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r1, [rGLUE, #offGlue_entryPoint]
9354ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC,r0
9355ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
93567a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng
9357ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9358ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r2,#kJitSingleStep     @ Ask for single step and then revert
9359ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str    r2,[rGLUE,#offGlue_jitState]
9360ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,#1                  @ set changeInterp to bail to debug interp
9361ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b      common_gotoBail
9362ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
936340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
936440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * Return from the translation cache and immediately request
936540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * a translation for the exit target.  Commonly used for callees.
936640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
936740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
936840094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
936986717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
937040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmBumpNoChain
937140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng#endif
937240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
937340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC
937440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
937540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
937640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r1, rPC                  @ arg1 of translation may need this
937740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
937840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    cmp    r0,#0
937940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bxne   r0                       @ continue native execution if so
938040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    b      2f
9381ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9382ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9383ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache and immediately request
9384ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a translation for the exit target.  Commonly used following
9385ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * invokes.
9386ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
938740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
938840094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
93899a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
93907a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
93919a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
9392ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
93937a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    bl     dvmJitGetCodeAddr       @ Is there a translation?
93947a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
9395ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
9396ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq    2f
9397ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
9398ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
93999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
94009a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
940146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
940246cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
940346cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
9404ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9405ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* No translation, so request one if profiling isn't disabled*/
9406ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng2:
94071da12167d913efde56ec3b40491524b051679f2cAndy McFadden    adrl   rIBASE, dvmAsmInstructionStart
9408ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9409ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9410ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0, #0
941140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
9412ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne    common_selectTrace
9413ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9414ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9415ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9416ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9417ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter.
9418ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The return was done with a BLX from thumb mode, and
9419ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the following 32-bit word contains the target rPC value.
9420ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Note that lr (r14) will have its low-order bit set to denote
9421ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * its thumb-mode origin.
9422ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
9423ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We'll need to stash our lr origin away, recover the new
9424ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * target and then check to see if there is a translation available
9425ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for our new target.  If so, we do a translation chain and
9426ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * go back to native execution.  Otherwise, it's back to the
9427ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * interpreter (after treating this entry as a potential
9428ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace start).
9429ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9430ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNormal
9431ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNormal:
94329a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
94337a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
94349a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
943586717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
9436ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNormal
9437ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9438ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
9439ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
94407a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
9441ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
944246cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    beq    toInterpreter            @ go if not, otherwise do chain
9443ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
9444ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
94459a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
94469a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
944746cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
944846cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
944946cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
9450ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9451ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9452ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter to do method invocation.
9453ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Check if translation exists for the callee, but don't chain to it.
9454ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9455ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNoChain
9456ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNoChain:
945786717f79d9b018f4d69cc991075fa36611f234e5Ben Cheng#ifdef JIT_STATS
9458ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNoChain
9459ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
94607a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
9461ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
9462ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitGetCodeAddr        @ Is there a translation?
94637a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
94649a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
94659a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
9466ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
9467ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne   r0                       @ continue native execution if so
946897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
9469ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9470ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9471ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * No translation, restore interpreter regs and start interpreting.
9472ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * rGLUE & rFP were preserved in the translated code, and rPC has
9473ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * already been restored by the time we get here.  We'll need to set
9474ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * up rIBASE & rINST, and load the address of the JitTable into r0.
9475ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
947646cd5b63c29d3284a9ff3e0d0711fb136f409313Bill BuzbeetoInterpreter:
9477ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
9478ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    adrl   rIBASE, dvmAsmInstructionStart
9479ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
9480ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9481ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ NOTE: intended fallthrough
9482ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9483ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Common code to update potential trace start counter, and initiate
9484ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a trace-build if appropriate.  On entry, rPC should point to the
9485ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * next instruction to execute, and rINST should be already loaded with
9486ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the next opcode word, and r0 holds a pointer to the jit profile
9487ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * table (pJitProfTable).
9488ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9489ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_testUpdateProfile:
9490ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
9491ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9492ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFEQ(ip)       @ if not profiling, fallthrough otherwise */
9493ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9494ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_updateProfile:
9495ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
94967b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
94977b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
9498ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9499ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    r1,r1,#1           @ decrement counter
95007b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
9501ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
9502ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9503ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9504ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Here, we switch to the debug interpreter to request
9505ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace selection.  First, though, check to see if there
9506ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * is already a native translation in place (and, if so,
9507ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * jump to it now).
9508ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
9509d726991ba52466cde88e37aba4de2395b62477faBill Buzbee    GET_JIT_THRESHOLD(r1)
95107a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [rGLUE, #offGlue_self] @ callee saved r10 <- glue->self
95117b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
9512ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
9513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0,rPC
9514ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
95157a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
95167a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r1, rPC                     @ arg1 of translation may need this
95177a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
9518ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
951997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
9520ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    r0                          @ jump to the translation
952140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     r2,#kJitTSelectRequest      @ ask for trace selection
952240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    @ fall-through to common_selectTrace
952397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
952440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
95259a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    beq     common_selectTrace
95269a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
95279a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * At this point, we have a target translation.  However, if
95289a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * that translation is actually the interpret-only pseudo-translation
95299a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * we want to treat it the same as no translation.
95309a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
9531d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov     r10, r0                     @ save target
95329a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bl      dvmCompilerGetInterpretTemplate
9533d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    cmp     r0, r10                     @ special case?
9534d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bne     jitSVShadowRunStart         @ set up self verification shadow space
95359a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GET_INST_OPCODE(ip)
95369a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GOTO_OPCODE(ip)
95379a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /* no return */
953897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
95399a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
954040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
954140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * On entry:
954240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
954340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
9544ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_selectTrace:
9545ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r2,[rGLUE,#offGlue_jitState]
95469c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    mov     r2,#kInterpEntryInstr       @ normal entry reason
95479c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    str     r2,[rGLUE,#offGlue_entryPoint]
9548ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1,#1                       @ set changeInterp
9549ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    b       common_gotoBail
9550ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
955197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
955297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
955397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Save PC and registers to shadow memory for self verification mode
955497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping to native translation.
9555d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * On entry:
9556d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng *    rPC, rFP, rGLUE: the values that they should contain
9557d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng *    r10: the address of the target translation.
955897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
9559d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunStart:
956097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r0,rPC                      @ r0<- program counter
956197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r1,rFP                      @ r1<- frame pointer
956297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r2,rGLUE                    @ r2<- InterpState pointer
95639a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r3,r10                      @ r3<- target translation
956497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl      dvmSelfVerificationSaveState @ save registers to shadow space
9565ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
9566ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    add     rGLUE,r0,#offShadowSpace_interpState @ rGLUE<- rGLUE in shadow space
9567ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    bx      r10                         @ jump to the translation
956897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
956997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
957097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Restore PC, registers, and interpState to original values
957197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping back to the interpreter.
957297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
9573d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunEnd:
957497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,rFP                        @ pass ending fp
957597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
9576ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rPC,[r0,#offShadowSpace_startPC] @ restore PC
9577ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rFP,[r0,#offShadowSpace_fp]   @ restore FP
9578ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    rGLUE,[r0,#offShadowSpace_glue] @ restore InterpState
9579ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
958097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    cmp    r1,#0                         @ check for punt condition
958197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    beq    1f
958297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kJitSelfVerification      @ ask for self verification
958397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    str    r2,[rGLUE,#offGlue_jitState]
958430f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    mov    r2,#kInterpEntryInstr         @ normal entry reason
958530f1f463b132c7b6daf2de825c5fa44ce356ca13Ben Cheng    str    r2,[rGLUE,#offGlue_entryPoint]
958697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,#1                         @ set changeInterp
958797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    b      common_gotoBail
958897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
958997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao1:                                       @ exit to interpreter without check
959097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    EXPORT_PC()
959197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    adrl   rIBASE, dvmAsmInstructionStart
959297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    FETCH_INST()
959397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GET_INST_OPCODE(ip)
959497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GOTO_OPCODE(ip)
959597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
959697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
9597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9598ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
9599a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9600a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Common code when a backward branch is taken.
9601a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9602a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On entry:
9603a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r9 is PC adjustment *in bytes*
9604a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
9605a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_backwardBranch:
9606a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #kInterpEntryInstr
9607a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_periodicChecks
9608ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
9609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9610ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
9611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
9612ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
9613ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
9614ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
9615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
9616a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST_RB(r9)           @ update rPC, load rINST
9617a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9618a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9619ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9620a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9621a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9622a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9623a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Need to see if the thread needs to be suspended or debugger/profiler
9624a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * activity has begun.
9625a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9626a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * TODO: if JDWP isn't running, zero out pDebuggerActive pointer so we don't
9627a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * have to do the second ldr.
9628a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9629a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * TODO: reduce this so we're just checking a single location.
9630a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9631a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On entry:
9632a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r0 is reentry type, e.g. kInterpEntryInstr
9633a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r9 is trampoline PC adjustment *in bytes*
9634a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
9635a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_periodicChecks:
9636a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_pSelfSuspendCount] @ r3<- &suspendCount
9637a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
96389c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    @ speculatively store r0 before it is clobbered by dvmCheckSuspendPending
96399c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng    str     r0, [rGLUE, #offGlue_entryPoint]
96409c147b84ff7fe2c39228742b06a9ef180d39b48fBen Cheng
9641a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#if defined(WITH_DEBUGGER)
9642a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [rGLUE, #offGlue_pDebuggerActive]   @ r1<- &debuggerActive
9643a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9644a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#if defined(WITH_PROFILER)
9645a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_pActiveProfilers]  @ r2<- &activeProfilers
9646a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9647a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9648a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3]                    @ r3<- suspendCount (int)
9649a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9650a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#if defined(WITH_DEBUGGER)
9651a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrb    r1, [r1]                    @ r1<- debuggerActive (boolean)
9652a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9653a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#if defined (WITH_PROFILER)
9654a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2]                    @ r2<- activeProfilers (int)
9655a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9656a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9657a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, #0                      @ suspend pending?
9658a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     2f                          @ yes, do full suspension check
9659a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9660a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#if defined(WITH_DEBUGGER) || defined(WITH_PROFILER)
9661a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden# if defined(WITH_DEBUGGER) && defined(WITH_PROFILER)
9662a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    orrs    r1, r1, r2                  @ r1<- r1 | r2
9663a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ debugger attached or profiler started?
9664a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden# elif defined(WITH_DEBUGGER)
9665a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ debugger attached?
9666a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden# elif defined(WITH_PROFILER)
9667a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ profiler started?
9668a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden# endif
9669a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     3f                          @ debugger/profiler, switch interp
9670a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9671a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9672a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr                          @ nothing to do, return
9673a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9674a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden2:  @ check suspend
9675964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
9676964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    /*
9677964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * Refresh the Jit's cached copy of profile table pointer.  This pointer
9678964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     * doubles as the Jit's on/off switch.
9679964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee     */
9680d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ r3<-&gDvmJit.pJitProfTable
9681a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
9682d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    ldr     r3, [r3] @ r3 <- pJitProfTable
9683a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()                         @ need for precise GC
9684964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh Jit's on/off switch
9685964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#else
9686964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- glue->self
9687964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    EXPORT_PC()                         @ need for precise GC
9688964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
9689a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       dvmCheckSuspendPending      @ suspend if necessary, then return
9690a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9691a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden3:  @ debugger/profiler enabled, bail out
9692a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     rPC, rPC, r9                @ update rPC
9693a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #1                      @ "want switch" = true
9694a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_gotoBail
9695a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9696a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9697a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9698a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * The equivalent of "goto bail", this calls through the "bail handler".
9699a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9700a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * State registers will be saved to the "glue" area before bailing.
9701a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9702a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On entry:
9703a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r1 is "bool changeInterp", indicating if we want to switch to the
9704a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *     other interpreter or just bail all the way out
9705a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
9706a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_gotoBail:
9707a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
9708a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rGLUE                   @ r0<- glue ptr
9709a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       dvmMterpStdBail             @ call(glue, changeInterp)
9710a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9711a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @add     r1, r1, #1                  @ using (boolean+1)
9712a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @add     r0, rGLUE, #offGlue_jmpBuf  @ r0<- &glue->jmpBuf
9713a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      _longjmp                    @ does not return
9714a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @bl      common_abort
9715a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9716a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9717a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9718a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Common code for method invocation with range.
9719a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9720a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On entry:
9721a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r0 is "Method* methodToCall", the method we're trying to call
9722a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
9723a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_invokeMethodRange:
9724a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LinvokeNewRange:
9725a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ prepare to copy args to "outs" area of current frame
9726a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
9727a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
9728a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LinvokeArgsDone            @ if no args, skip the rest
9729a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- CCCC
9730a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9731a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
9732a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ (very few methods have > 10 args; could unroll for common cases)
9733a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
9734a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
9735a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
9736a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:  ldr     r1, [r3], #4                @ val = *fp++
9737a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    subs    r2, r2, #1                  @ count--
9738a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r10], #4               @ *outs++ = val
9739a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     1b                          @ ...while count != 0
9740a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r3, [r0, #offMethod_outsSize]   @ r3<- methodToCall->outsSize
9741a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .LinvokeArgsDone
9742a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9743a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9744a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Common code for method invocation without range.
9745a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9746a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On entry:
9747a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *  r0 is "Method* methodToCall", the method we're trying to call
9748a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
9749a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_invokeMethodNoRange:
9750a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LinvokeNewNoRange:
9751a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ prepare to copy args to "outs" area of current frame
9752a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
9753a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
9754a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
9755a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
9756a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
9757a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     .LinvokeArgsDone
9758a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9759a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ r0=methodToCall, r1=GFED, r3=outSize, r2=count, r9=regSize, r10=outs
9760a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LinvokeNonRange:
9761a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    rsb     r2, r2, #5                  @ r2<- 5-r2
9762a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
9763a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_abort                @ (skipped due to ARM prefetch)
9764a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden5:  and     ip, rINST, #0x0f00          @ isolate A
9765a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
9766a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0                      @ nop
9767a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r2, [r10, #-4]!             @ *--outs = vA
9768a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden4:  and     ip, r1, #0xf000             @ isolate G
9769a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
9770a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0                      @ nop
9771a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r2, [r10, #-4]!             @ *--outs = vG
9772a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden3:  and     ip, r1, #0x0f00             @ isolate F
9773a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
9774a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0                      @ nop
9775a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r2, [r10, #-4]!             @ *--outs = vF
9776a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden2:  and     ip, r1, #0x00f0             @ isolate E
9777a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
9778a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0                      @ nop
9779a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r2, [r10, #-4]!             @ *--outs = vE
9780a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:  and     ip, r1, #0x000f             @ isolate D
9781a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
9782a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r0                      @ nop
9783a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r2, [r10, #-4]!             @ *--outs = vD
9784a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden0:  @ fall through to .LinvokeArgsDone
9785a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9786a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LinvokeArgsDone: @ r0=methodToCall, r3=outSize, r9=regSize
9787a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
9788a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
9789a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ find space for the new stack frame, check for overflow
9790a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
9791a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
9792a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
9793a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden@    bl      common_dumpRegs
9794a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
9795a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
9796a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r3, r9                      @ bottom < interpStackEnd?
9797a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
97987a44e4ee0782d24b4c6090be1f0a3c66f971f2c1Andy McFadden    blo     .LstackOverflow             @ yes, this frame will overflow stack
9799a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9800a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ set up newSaveArea
9801a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#ifdef EASY_GDB
9802a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
9803a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     ip, [r10, #offStackSaveArea_prevSave]
9804a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9805a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     rFP, [r10, #offStackSaveArea_prevFrame]
9806a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     rPC, [r10, #offStackSaveArea_savedPc]
9807ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
9808ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, #0
9809ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r9, [r10, #offStackSaveArea_returnAddr]
9810ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9811a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [r10, #offStackSaveArea_method]
9812a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    tst     r3, #ACC_NATIVE
9813a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     .LinvokeNative
9814a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9815a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
9816a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0-r3}
9817a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_printNewline
9818a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rFP
9819a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0
9820a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmDumpFp
9821a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0-r3}
9822a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0-r3}
9823a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r1
9824a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10
9825a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmDumpFp
9826a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_printNewline
9827a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0-r3}
9828a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    */
9829a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9830a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
9831a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
9832a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     rPC, r2                         @ publish new rPC
9833a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
9834a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9835a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ Update "glue" values for the new method
9836a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ r0=methodToCall, r1=newFp, r2=self, r3=newMethodClass, r9=newINST
9837a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
9838a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
9839ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
9840ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9841a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     rFP, r1                         @ fp = newFp
9842a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
9843a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     rINST, r9                       @ publish new rINST
9844a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
9845ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
9846ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
9847a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                         @ jump to next instruction
9848ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
9849ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
9850ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
9851ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rINST, r9                       @ publish new rINST
9852ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [r2, #offThread_curFrame]   @ self->curFrame = newFp
9853ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                         @ jump to next instruction
9854ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9855a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9856a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LinvokeNative:
9857a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ Prep for the native call
9858a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ r0=methodToCall, r1=newFp, r10=newSaveArea
9859a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
9860d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
9861a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
9862d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
9863a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, r3                      @ r9<- glue->self (preserve)
9864a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9865a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, r0                      @ r2<- methodToCall
9866a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r1                      @ r0<- newFp (points to args)
9867a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
9868a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9869a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#ifdef ASSIST_DEBUGGER
9870a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* insert fake function header to help gdb find the stack frame */
9871a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       .Lskip
9872a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .type   dalvik_mterp, %function
9873a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddendalvik_mterp:
9874a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .fnstart
9875a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    MTERP_ENTRY1
9876a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    MTERP_ENTRY2
9877a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.Lskip:
9878a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9879a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9880a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @mov     lr, pc                      @ set return addr
9881a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
9882a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    LDR_PC_LR "[r2, #offMethod_nativeFunc]"
9883a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9884964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
9885964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable] @ Refresh Jit's on/off status
9886964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
9887964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
9888a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ native return; r9=self, r10=newSaveArea
9889a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ equivalent to dvmPopJniLocals
9890d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
9891a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r9, #offThread_exception] @ check for exception
9892964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
9893964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3]                    @ r3 <- gDvmJit.pProfTable
9894964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
9895a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
9896a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ null?
9897d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
9898964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#if defined(WITH_JIT)
9899964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable] @ refresh cached on/off switch
9900964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee#endif
9901a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bne     common_exceptionThrown      @ no, handle exception
9902a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9903a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
9904a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9905a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9906a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
99076ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    @ r0=methodToCall
99086ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    mov     r1, r0                      @ r1<- methodToCall
9909a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_self]  @ r0<- self
9910a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmHandleStackOverflow
9911a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
9912a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#ifdef ASSIST_DEBUGGER
9913a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .fnend
9914a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
9915a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9916a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9917a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
9918a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Common code for method invocation, calling through "glue code".
9919a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
9920a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * TODO: now that we have range and non-range invoke handlers, this
9921a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *       needs to be split into two.  Maybe just create entry points
9922a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *       that set r9 and jump here?
9923a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *
9924a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * On entry:
9925a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r0 is "Method* methodToCall", the method we're trying to call
9926a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     *  r9 is "bool methodCallRange", indicating if this is a /range variant
9927a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
9928a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     .if    0
9929a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LinvokeOld:
9930a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     sp, sp, #8                  @ space for args + pad
9931a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
9932a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, r0                      @ A2<- methodToCall
9933a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rGLUE                   @ A0<- glue
9934a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVE_PC_FP_TO_GLUE()                @ export state to "glue"
9935a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r9                      @ A1<- methodCallRange
9936a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, rINST, lsr #8           @ A3<- AA
9937a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     ip, [sp, #0]                @ A4<- ip
9938a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
9939a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     sp, sp, #8                  @ remove arg area
9940a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_resumeAfterGlueCall  @ continue to next instruction
9941a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
9942a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9943a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9944a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9945a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
9946a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Common code for handling a return instruction.
9947a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
9948a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * This does not return.
9949a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
9950a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_returnFromMethod:
9951a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LreturnNew:
9952a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #kInterpEntryReturn
9953a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #0
9954a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_periodicChecks
9955a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9956a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
9957a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
9958a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
9959a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
9960a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden                                        @ r2<- method we're returning to
9961a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
9962a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r2, #0                      @ is this a break frame?
9963a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
9964a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0                      @ "want switch" = false
9965a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     common_gotoBail             @ break frame, bail out completely
9966a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9967a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
9968a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
9969a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
9970a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     rFP, [r3, #offThread_curFrame]  @ self->curFrame = fp
9971ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
99727a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
9973ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_JIT_PROF_TABLE(r0)
9974ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rPC, r9                     @ publish new rPC
9975ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [rGLUE, #offGlue_methodClassDex]
99767a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r10, [r3, #offThread_inJitCodeCache]  @ may return to JIT'ed land
99777a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    cmp     r10, #0                      @ caller is compiled code
99787a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    blxne   r10
9979ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9980ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
9981ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
9982ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
9983ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
9984a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9985a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     rPC, r9                     @ publish new rPC
9986a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [rGLUE, #offGlue_methodClassDex]
9987a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
9988ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
9989a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
9990a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
9991a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Return handling, calls through "glue code".
9992a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
9993a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     .if    0
9994a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LreturnOld:
9995a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVE_PC_FP_TO_GLUE()                @ export state
9996a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rGLUE                   @ arg to function
9997a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmMterp_returnFromMethod
9998a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_resumeAfterGlueCall
9999a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
10000a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10001a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10002a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10003a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Somebody has thrown an exception.  Handle it.
10004a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
10005a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * If the exception processing code returns to us (instead of falling
10006a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * out of the interpreter), continue with whatever the next instruction
10007a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * now happens to be.
10008a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
10009a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * This does not return.
10010a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10011ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     .global dvmMterpCommonExceptionThrown
10012ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmMterpCommonExceptionThrown:
10013a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_exceptionThrown:
10014a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LexceptionNew:
10015a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #kInterpEntryThrow
10016a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r9, #0
10017a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      common_periodicChecks
10018a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10019a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r10, [rGLUE, #offGlue_self] @ r10<- glue->self
10020a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r9, [r10, #offThread_exception] @ r9<- self->exception
10021a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10                     @ r1<- self
10022a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r9                      @ r0<- exception
10023a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
10024a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, #0                      @ r3<- NULL
10025a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r3, [r10, #offThread_exception] @ self->exception = NULL
10026a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10027a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* set up args and a local for "&fp" */
10028a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
10029a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     rFP, [sp, #-4]!             @ *--sp = fp
10030a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     ip, sp                      @ ip<- &fp
10031a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, #0                      @ r3<- false
10032a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     ip, [sp, #-4]!              @ *--sp = &fp
10033a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [rGLUE, #offGlue_method] @ r1<- glue->method
10034a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r10                     @ r0<- self
10035a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
10036a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, r9                      @ r2<- exception
10037a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r1, rPC, r1                 @ r1<- pc - method->insns
10038a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r1, asr #1              @ r1<- offset in code units
10039a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10040a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* call, r0 gets catchRelPc (a code-unit offset) */
10041a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
10042a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10043a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* fix earlier stack overflow if necessary; may trash rFP */
10044a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrb    r1, [r10, #offThread_stackOverflowed]
10045a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ did we overflow earlier?
10046a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    beq     1f                          @ no, skip ahead
10047a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     rFP, r0                     @ save relPc result in rFP
10048a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r10                     @ r0<- self
100494fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    mov     r1, r9                      @ r1<- exception
10050a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmCleanupStackOverflow     @ call(self)
10051a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rFP                     @ restore result
10052a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden1:
10053a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10054a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* update frame pointer and check result from dvmFindCatchBlock */
10055a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
10056a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r0, #0                      @ is catchRelPc < 0?
10057a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     sp, sp, #8                  @ restore stack
10058a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bmi     .LnotCaughtLocally
10059a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10060a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* adjust locals to match self->curFrame and updated PC */
10061a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
10062a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
10063a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r1, [rGLUE, #offGlue_method]    @ glue->method = new method
10064a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
10065a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
10066a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
10067a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
10068a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r2, [rGLUE, #offGlue_methodClassDex] @ glue->pDvmDex = meth...
10069a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10070a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* release the tracked alloc on the exception */
10071a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r9                      @ r0<- exception
10072a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10                     @ r1<- self
10073a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmReleaseTrackedAlloc      @ release the exception
10074a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10075a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* restore the exception if the handler wants it */
10076a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_INST()                        @ load rINST from rPC
10077a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10078a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
10079a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    streq   r9, [r10, #offThread_exception] @ yes, restore the exception
10080a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
10081a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10082a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LnotCaughtLocally: @ r9=exception, r10=self
10083a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* fix stack overflow if necessary */
10084a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldrb    r1, [r10, #offThread_stackOverflowed]
10085a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    cmp     r1, #0                      @ did we overflow earlier?
10086a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    movne   r0, r10                     @ if yes: r0<- self
100874fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    movne   r1, r9                      @ if yes: r1<- exception
10088a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    blne    dvmCleanupStackOverflow     @ if yes: call(self)
10089a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10090a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ may want to show "not caught locally" debug messages here
10091a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#if DVM_SHOW_EXCEPTION >= 2
10092a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* call __android_log_print(prio, tag, format, ...) */
10093a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /* "Exception %s from %s:%d not caught locally" */
10094a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ dvmLineNumFromPC(method, pc - method->insns)
10095a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]
10096a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, [r0, #offMethod_insns]
10097a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    sub     r1, rPC, r1
10098a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    asr     r1, r1, #1
10099a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmLineNumFromPC
10100a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [sp, #-4]!
10101a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ dvmGetMethodSourceFile(method)
10102a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, [rGLUE, #offGlue_method]
10103a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmGetMethodSourceFile
10104a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r0, [sp, #-4]!
10105a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @ exception->clazz->descriptor
10106a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r9, #offObject_clazz]
10107a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r3, [r3, #offClassObject_descriptor]
10108a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    @
10109a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r2, strExceptionNotCaughtLocally
10110a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, strLogTag
10111a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, #3                      @ LOG_DEBUG
10112a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      __android_log_print
10113a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#endif
10114a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    str     r9, [r10, #offThread_exception] @ restore exception
10115a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, r9                      @ r0<- exception
10116a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r10                     @ r1<- self
10117a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmReleaseTrackedAlloc      @ release the exception
10118a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0                      @ "want switch" = false
10119a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_gotoBail             @ bail out
10120a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10121a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10122a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
10123a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Exception handling, calls through "glue code".
10124a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
10125a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     0
10126a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LexceptionOld:
10127a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SAVE_PC_FP_TO_GLUE()                @ export state
10128a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r0, rGLUE                   @ arg to function
10129a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmMterp_exceptionThrown
10130a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_resumeAfterGlueCall
10131a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
10132a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10133a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10134a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10135a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * After returning from a "glued" function, pull out the updated
10136a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * values and start executing at the next instruction.
10137a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10138a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_resumeAfterGlueCall:
10139a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    LOAD_PC_FP_FROM_GLUE()              @ pull rPC and rFP out of glue
10140a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    FETCH_INST()                        @ load rINST from rPC
10141a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10142a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
10143a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10144a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10145a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Invalid array index.
10146a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10147a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_errArrayIndex:
10148a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
10149a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strArrayIndexException
10150a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0
10151a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
10152a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
10153a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10154a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10155a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Invalid array value.
10156a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10157a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_errArrayStore:
10158a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
10159a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strArrayStoreException
10160a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0
10161a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
10162a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
10163a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10164a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10165a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Integer divide or mod by zero.
10166a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10167a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_errDivideByZero:
10168a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
10169a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strArithmeticException
10170a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r1, strDivideByZero
10171a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
10172a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
10173a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10174a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10175a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Attempt to allocate an array with a negative size.
10176a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10177a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_errNegativeArraySize:
10178a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
10179a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strNegativeArraySizeException
10180a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0
10181a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
10182a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
10183a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10184a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10185a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Invocation of a non-existent method.
10186a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10187a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_errNoSuchMethod:
10188a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
10189a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strNoSuchMethodError
10190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0
10191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
10192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
10193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * We encountered a null object when we weren't expecting one.  We
10196a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * export the PC, throw a NullPointerException, and goto the exception
10197a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * processing code.
10198a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10199a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_errNullObject:
10200a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    EXPORT_PC()
10201a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strNullPointerException
10202a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #0
10203a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmThrowException
10204a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    b       common_exceptionThrown
10205a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10206a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10207a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * For debugging, cause an immediate fault.  The source address will
10208a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * be in lr (use a bl instruction to jump here).
10209a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10210a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_abort:
10211a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     pc, .LdeadFood
10212a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LdeadFood:
10213a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   0xdeadf00d
10214a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10215a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10216a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Spit out a "we were here", preserving all registers.  (The attempt
10217a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * to save ip won't work, but we need to save an even number of
10218a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * registers for EABI 64-bit stack alignment.)
10219a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10220a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .macro  SQUEAK num
10221a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_squeak\num:
10222a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10223a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strSqueak
10224a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, #\num
10225a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      printf
10226a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10227a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr
10228a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endm
10229a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10230a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SQUEAK  0
10231a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SQUEAK  1
10232a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SQUEAK  2
10233a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SQUEAK  3
10234a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SQUEAK  4
10235a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    SQUEAK  5
10236a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10237a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10238a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Spit out the number in r0, preserving registers.
10239a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10240a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_printNum:
10241a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10242a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r0
10243a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strSqueak
10244a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      printf
10245a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10246a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr
10247a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10248a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10249a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Print a newline, preserving registers.
10250a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10251a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_printNewline:
10252a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10253a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strNewline
10254a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      printf
10255a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10256a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr
10257a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10258a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    /*
10259a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
10260a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden     */
10261a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_printHex:
10262a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10263a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r1, r0
10264a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strPrintHex
10265a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      printf
10266a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10267a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr
10268a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10269a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10270a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Print the 64-bit quantity in r0-r1, preserving registers.
10271a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10272a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_printLong:
10273a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10274a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r3, r1
10275a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    mov     r2, r0
10276a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldr     r0, strPrintLong
10277a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      printf
10278a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10279a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr
10280a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10281a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10282a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Print full method info.  Pass the Method* in r0.  Preserves regs.
10283a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10284a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_printMethod:
10285a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10286a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmMterpPrintMethod
10287a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10288a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr
10289a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10290a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10291a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Call a C helper function that dumps regs and possibly some
10292a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * additional info.  Requires the C function to be compiled in.
10293a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10294a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .if     0
10295a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddencommon_dumpRegs:
10296a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
10297a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bl      dvmMterpDumpArmRegs
10298a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
10299a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bx      lr
10300a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .endif
10301a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10302d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#if 0
10303d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden/*
10304d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Experiment on VFP mode.
10305d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10306d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * uint32_t setFPSCR(uint32_t val, uint32_t mask)
10307d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
10308d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Updates the bits specified by "mask", setting them to the values in "val".
10309d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden */
10310d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddensetFPSCR:
10311d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r0, r0, r1                  @ make sure no stray bits are set
10312d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmrx    r2, fpscr                   @ get VFP reg
10313d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mvn     r1, r1                      @ bit-invert mask
10314d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r2, r2, r1                  @ clear masked bits
10315d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    orr     r2, r2, r0                  @ set specified bits
10316d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmxr    fpscr, r2                   @ set VFP reg
10317d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, r2                      @ return new value
10318d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bx      lr
10319d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10320d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .align  2
10321d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .global dvmConfigureFP
10322d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .type   dvmConfigureFP, %function
10323d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddendvmConfigureFP:
10324d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    stmfd   sp!, {ip, lr}
10325d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x03000000 sets DN/FZ */
10326d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x00009f00 clears the six exception enable flags */
10327d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      common_squeak0
10328d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, #0x03000000             @ r0<- 0x03000000
10329d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
10330d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      setFPSCR
10331d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    ldmfd   sp!, {ip, pc}
10332d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#endif
10333d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
10334a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10335a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10336a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * String references, must be close to the code that uses them.
10337a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10338a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .align  2
10339a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrArithmeticException:
10340a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrArithmeticException
10341a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrArrayIndexException:
10342a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrArrayIndexException
10343a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrArrayStoreException:
10344a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrArrayStoreException
10345a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrDivideByZero:
10346a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrDivideByZero
10347a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrNegativeArraySizeException:
10348a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrNegativeArraySizeException
10349a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrNoSuchMethodError:
10350a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrNoSuchMethodError
10351a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrNullPointerException:
10352a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrNullPointerException
10353a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10354a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrLogTag:
10355a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrLogTag
10356a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrExceptionNotCaughtLocally:
10357a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrExceptionNotCaughtLocally
10358a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10359a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrNewline:
10360a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrNewline
10361a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrSqueak:
10362a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrSqueak
10363a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrPrintHex:
10364a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrPrintHex
10365a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenstrPrintLong:
10366a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .word   .LstrPrintLong
10367a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10368a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
10369a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Zero-terminated ASCII string data.
10370a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden *
10371a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * On ARM we have two choices: do like gcc does, and LDR from a .word
10372a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * with the address, or use an ADR pseudo-op to get the address
10373a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * directly.  ADR saves 4 bytes and an indirection, but it's using a
10374a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * PC-relative addressing mode and hence has a limited range, which
10375a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * makes it not work well with mergeable string sections.
10376a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
10377a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .section .rodata.str1.4,"aMS",%progbits,1
10378a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10379a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrBadEntryPoint:
10380a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Bad entry point %d\n"
10381a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrArithmeticException:
10382a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/ArithmeticException;"
10383a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrArrayIndexException:
10384a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
10385a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrArrayStoreException:
10386a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/ArrayStoreException;"
10387a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrClassCastException:
10388a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/ClassCastException;"
10389a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrDivideByZero:
10390a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "divide by zero"
10391a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrFilledNewArrayNotImpl:
10392a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "filled-new-array only implemented for objects and 'int'"
10393a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrInternalError:
10394a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/InternalError;"
10395a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrInstantiationError:
10396a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/InstantiationError;"
10397a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrNegativeArraySizeException:
10398a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/NegativeArraySizeException;"
10399a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrNoSuchMethodError:
10400a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/NoSuchMethodError;"
10401a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrNullPointerException:
10402a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Ljava/lang/NullPointerException;"
10403a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10404a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrLogTag:
10405a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "mterp"
10406a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrExceptionNotCaughtLocally:
10407a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "Exception %s from %s:%d not caught locally\n"
10408a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10409a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrNewline:
10410a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "\n"
10411a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrSqueak:
10412a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "<%d>"
10413a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrPrintHex:
10414a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "<0x%x>"
10415a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden.LstrPrintLong:
10416a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    .asciz  "<%lld>"
10417a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10418a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
10419