CompilerTemplateAsm-armv5te.S revision 40094c16d9727cc1e047a7d4bddffe04dd566211
1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * This file was generated automatically by gen-template.py for 'armv5te'.
3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * --> DO NOT EDIT <--
5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/header.S */
8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Copyright (C) 2008 The Android Open Source Project
10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License");
12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * you may not use this file except in compliance with the License.
13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * You may obtain a copy of the License at
14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *      http://www.apache.org/licenses/LICENSE-2.0
16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unless required by applicable law or agreed to in writing, software
18ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS,
19ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See the License for the specific language governing permissions and
21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * limitations under the License.
22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
23ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
24ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
25ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
26ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ARMv5 definitions and declarations.
28ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
29ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
30ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
31ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengARM EABI general notes:
32ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
33ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr0-r3 hold first 4 args to a method; they are not preserved across method calls
34ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr4-r8 are available for general use
35ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr9 is given special treatment in some situations, but not for us
36ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr10 (sl) seems to be generally available
37ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
38ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr12 (ip) is scratch -- not preserved across method calls
39ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr13 (sp) should be managed carefully in case a signal arrives
40ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr14 (lr) must be preserved
41ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr15 (pc) can be tinkered with directly
42ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
43ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr0 holds returns of <= 4 bytes
44ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengr0-r1 hold returns of 8 bytes, low word in r0
45ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
46ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengCallee must save/restore r4+ (except r12) if it modifies them.
47ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
48ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengStack is "full descending".  Only the arguments that don't fit in the first 4
49ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengregisters are placed on the stack.  "sp" points at the first stacked argument
50ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng(i.e. the 5th arg).
51ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
52ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengVFP: single-precision results in s0, double-precision results in d0.
53ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
54ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengIn the EABI, "sp" must be 64-bit aligned on entry to a function, and any
55ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng64-bit quantities (long long, double) must be 64-bit aligned.
56ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng*/
57ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
58ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
59ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengJIT and ARM notes:
60ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
61ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengThe following registers have fixed assignments:
62ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
63ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng  reg nick      purpose
64ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng  r5  rFP       interpreted frame pointer, used for accessing locals and args
65ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng  r6  rGLUE     MterpGlue pointer
66ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
67ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengThe following registers have fixed assignments in mterp but are scratch
68ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengregisters in compiled code
69ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
70ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng  reg nick      purpose
71ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng  r4  rPC       interpreted program counter, used for fetching instructions
721da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r7  rINST     first 16-bit code unit of current instruction
731da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r8  rIBASE    interpreted instruction base pointer, used for computed goto
74ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengMacros are provided for common operations.  Each macro MUST emit only
76ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengone instruction to make instruction-counting easier.  They MUST NOT alter
77ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengunspecified registers or condition codes.
78ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng*/
79ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
80ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* single-purpose registers, given names for clarity */
81ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define rPC     r4
82ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define rFP     r5
83ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define rGLUE   r6
841da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rINST   r7
851da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rIBASE  r8
86ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
87ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
88ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Given a frame pointer, find the stack save area.
89ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
90ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * In C this is "((StackSaveArea*)(_fp) -1)".
91ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
92ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define SAVEAREA_FROM_FP(_reg, _fpreg) \
93ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     _reg, _fpreg, #sizeofStackSaveArea
94ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
959a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee#define EXPORT_PC() \
969a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
979a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
98ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
99ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * This is a #include, not a %include, because we want the C pre-processor
100ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to expand the macros into assembler assignment statements.
101ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
102ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "../../../mterp/common/asm-constants.h"
103ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
104ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/platform.S */
106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
108342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee *  CPU-version-specific defines and utility
109ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Macro for "MOV LR,PC / LDR PC,xxx", which is not allowed pre-ARMv5.
114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Jump to subroutine.
115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * May modify IP and LR.
117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.macro  LDR_PC_LR source
119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     lr, pc
120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     pc, \source
121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.endm
122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompilerTemplateStart
125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .type   dvmCompilerTemplateStart, %function
126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .text
127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompilerTemplateStart:
129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
131ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMP_LONG
133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMP_LONG:
134ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMP_LONG.S */
135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * register based on the results of the comparison.
138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * We load the full values with LDM, but in practice many values could
140ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * be resolved by only looking at the high word.  This could be made
141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * faster or slower by splitting the LDM into a pair of LDRs.
142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * If we just wanted to set condition flags, we could do this:
144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  subs    ip, r0, r2
145ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  sbcs    ip, r1, r3
146ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  subeqs  ip, r0, r2
147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * integer value, which we can do with 2 conditional mov/mvn instructions
149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * (set 1, set -1; if they're equal we already have 0 in ip), giving
150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * us a constant 5-cycle path plus a branch at the end to the
151ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * instruction epilogue code.  The multi-compare approach below needs
152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * in the worst case (the 64-bit values are equal).
154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* cmp-long vAA, vBB, vCC */
156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blt     .LTEMPLATE_CMP_LONG_less            @ signed compare on high part
158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bgt     .LTEMPLATE_CMP_LONG_greater
159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    r0, r0, r2                  @ r0<- r0 - r2
160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxeq     lr
161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMP_LONG_greater         @ unsigned compare on low part
162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMP_LONG_less:
163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                      @ r0<- -1
164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMP_LONG_greater:
166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                      @ r0<- 1
167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
172ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_RETURN
173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_RETURN:
174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_RETURN.S */
175ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX.
177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * If the stored value in returnAddr
178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * is non-zero, the caller is compiled by the JIT thus return to the
179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * address in the code cache following the invoke instruction. Otherwise
180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * return to the special dvmJitToInterpNoChain entry point.
181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r10, [r0, #offStackSaveArea_prevFrame] @ r10<- saveArea->prevFrame
184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     rPC, [r0, #offStackSaveArea_savedPc] @ rPC<- saveArea->savedPc
18697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9,  [r0, #offStackSaveArea_returnAddr] @ r9<- chaining cell ret
18897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
18997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r9, #0                      @ disable chaining
19097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)]
192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                                        @ r2<- method we're returning to
193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r2, #0                      @ break frame?
19597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq     1f                          @ bail to interpreter
19797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
19897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    blxeq   lr                          @ punt to interpreter and compare state
19997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
2006c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r10                    @ publish new FP
202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
203ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [r8]                    @ r8<- suspendCount
204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
2066c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r3, #offThread_curFrame] @ self->curFrame = fp
208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
2096c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    str     r0, [rGLUE, #offGlue_methodClassDex]
210ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r8, #0                      @ check the suspendCount
211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movne   r9, #0                      @ clear the chaining cell address
2127a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r9, [r3, #offThread_inJitCodeCache] @ in code cache or not
213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r9, #0                      @ chaining cell exists?
214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blxne   r9                          @ jump to the chaining cell
2156c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#if defined(EXIT_STATS)
2166c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     r0, #kCallsiteInterpreted
2176c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif
2186c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     pc, r1                      @ callsite is interpreted
219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    stmia   rGLUE, {rPC, rFP}           @ SAVE_PC_FP_TO_GLUE()
221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, .LdvmMterpStdBail       @ defined in footer.S
222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, #0                      @ changeInterp = false
223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, rGLUE                   @ Expecting rGLUE in r0
224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blx     r2                          @ exit the interpreter
225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT
229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */
231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * runtime-resolved callee.
235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
241ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
243ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
244ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
246964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r8, [r8]                    @ r8<- suspendCount (int)
247ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxlt    lr                          @ return to raise stack overflow excep.
249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
254ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ set up newSaveArea
258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r8, #0                      @ suspendCount != 0
262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    lr                          @ bail to the interpreter
263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    tst     r10, #ACC_NATIVE
26497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
265ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .LinvokeNative
26697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
26797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bxne    lr                          @ bail to the interpreter
26897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
269ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
27040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
272ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
273ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
274ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Update "glue" values for the new method
275ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
276ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
277ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
278ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r2, #offThread_curFrame]  @ self->curFrame = newFp
279ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
280ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Start executing the callee
2816c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#if defined(EXIT_STATS)
2826c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     r0, #kInlineCacheMiss
2836c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif
28440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
285ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
286ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
287ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
288ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN
289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN:
290ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */
291ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
292ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For monomorphic callsite, setup the Dalvik frame and return to the
293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Thumb code through the link register to transfer control to the callee
294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * method through a dedicated chaining cell.
295ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
29738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ methodToCall is guaranteed to be non-native
29838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng.LinvokeChain:
299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
301ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
302ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
305ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r12, lr, #2                 @ setup the punt-to-interp address
308ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
309964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r8, [r8]                    @ r8<- suspendCount (int)
310ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
311ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxlt    r12                         @ return to raise stack overflow excep.
312ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
313ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
314ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
315ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
316ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
317ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
318ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
319ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ set up newSaveArea
320ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
321ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
322ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
323ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r8, #0                      @ suspendCount != 0
324ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    r12                         @ bail to the interpreter
325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
326ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
327ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
328ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
329ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Update "glue" values for the new method
330ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
331ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
332ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
333ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r2, #offThread_curFrame]  @ self->curFrame = newFp
334ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
335ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr                              @ return to the callee-chaining cell
336ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
337ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
338ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
339ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
340ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
34138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN
34238329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN:
34338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */
34438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    /*
34538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * For polymorphic callsite, check whether the cached class pointer matches
34638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * the current one. If so setup the Dalvik frame and return to the
34738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * Thumb code through the link register to transfer control to the callee
34838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * method through a dedicated chaining cell.
34938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
35089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee     * The predicted chaining cell is declared in ArmLIR.h with the
35138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * following layout:
35238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
35338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *  typedef struct PredictedChainingCell {
35438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      u4 branch;
35538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      const ClassObject *clazz;
35638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      const Method *method;
35738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      u4 counter;
35838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *  } PredictedChainingCell;
35938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
36038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * Upon returning to the callsite:
36138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr  : to branch to the chaining cell
36238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr+2: to punt to the interpreter
36338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr+4: to fully resolve the callee and may rechain.
36438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *            r3 <- class
36538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *            r9 <- counter
36638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     */
36738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite
36838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r3, [r0, #offObject_clazz]  @ r3 <- this->class
36938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r2, #4]    @ r8 <- predictedChainCell->clazz
37038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r0, [r2, #8]    @ r0 <- predictedChainCell->method
37138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r9, [r2, #12]   @ r9 <- predictedChainCell->counter
37238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r3, r8          @ predicted class == actual class?
37338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    beq     .LinvokeChain   @ predicted chain is valid
37438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r7, [r3, #offClassObject_vtable] @ r7 <- this->class->vtable
37538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    sub     r1, r9, #1      @ count--
37638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r1, [r2, #12]   @ write back to PredictedChainingCell->counter
37738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     lr, lr, #4      @ return to fully-resolve landing pad
37838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    /*
37938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r1 <- count
38038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r2 <- &predictedChainCell
38138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r3 <- this->class
38238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r4 <- dPC
38338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r7 <- this->class->vtable
38438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     */
38538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bx      lr
38638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
38738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */
38838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .balign 4
38938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE
39038329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE:
39138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */
39238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
39338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
39438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
39538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
39638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
39738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
39838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
39938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
40038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r8]                    @ r3<- suspendCount (int)
40138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
40238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bxlt    lr                          @ return to raise stack overflow excep.
40338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
40438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
40538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
40638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
40738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
40838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
40938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ set up newSaveArea
41038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
41138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
41238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
41338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
41438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r8, #0                      @ suspendCount != 0
41538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
41697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
41738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bxne    lr                          @ bail to the interpreter
41897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
41997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bx      lr                          @ bail to interpreter unconditionally
42097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
42138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
42238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ go ahead and transfer control to the native code
423d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
4247a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
42538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
4267a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ not in the jit code cache
427d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
428d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
42938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r9, r3                      @ r9<- glue->self (preserve)
43038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
43138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
43238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
43338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r0, r1                      @ r0<- newFP
43438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
43538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
43638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    blx     r8                          @ off to the native code
43738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
43838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ native return; r9=self, r10=newSaveArea
43938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ equivalent to dvmPopJniLocals
44038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
441d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
44238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r1, [r9, #offThread_exception] @ check for exception
44338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
44438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r1, #0                      @ null?
445d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
446909b418219f63c0d0b2bde8a0835dbf27d5061b8Bill Buzbee    ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
44760c24f436d603c564d5351a6f81821f12635733cBen Cheng
44860c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
44960c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
45060c24f436d603c564d5351a6f81821f12635733cBen Cheng
4517a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r9, #offThread_inJitCodeCache] @ set the mode properly
45260c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
45360c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
45460c24f436d603c564d5351a6f81821f12635733cBen Cheng
45560c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
45640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
45760c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
4587a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#if defined(EXIT_STATS)
4597a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
4607a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
46160c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
46260c24f436d603c564d5351a6f81821f12635733cBen Cheng
46360c24f436d603c564d5351a6f81821f12635733cBen Cheng
46438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
46538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
46638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */
46738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .balign 4
468ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPG_DOUBLE
469ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_DOUBLE:
470ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_DOUBLE.S */
471ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */
472ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
4731465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
474ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
475ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
476ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
477ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
478ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
479ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
480ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
481ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
482ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * See OP_CMPL_FLOAT for an explanation.
483ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
484ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For: cmpl-double, cmpg-double
485ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
486ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
4871465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    push    {r0-r3}                     @ save operands
4881465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
489ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cdcmple"       @ PIC way of "bl __aeabi_cdcmple"
490ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
491ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r1<- -1
492ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r1<- 0, trumps less than
4931465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    add     sp, #16                     @ drop unused operands
4941465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
495ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
496ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
497ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
498ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
499ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_DOUBLE_gt_or_nan:
5001465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r2-r3}                     @ restore operands in reverse order
5011465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r0-r1}                     @ restore operands in reverse order
502ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cdcmple"       @ r0<- Z set if eq, C clear if <
503ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
5041465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
505ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                            @ r1<- 1 or -1 for NaN
5061465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
507ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
508ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
509ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
510ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
511ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
512ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPL_DOUBLE
513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_DOUBLE:
514ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */
515ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5161465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
517ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
518ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
519ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
520ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
521ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
522ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
523ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
524ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
525ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * See OP_CMPL_FLOAT for an explanation.
526ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
527ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For: cmpl-double, cmpg-double
528ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
529ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
5301465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    push    {r0-r3}                     @ save operands
5311465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
532ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cdcmple"       @ PIC way of "bl __aeabi_cdcmple"
533ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
534ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r1<- -1
535ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r1<- 0, trumps less than
5361465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    add     sp, #16                     @ drop unused operands
5371465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
538ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
539ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
540ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
541ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
542ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_DOUBLE_gt_or_nan:
5431465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r2-r3}                     @ restore operands in reverse order
5441465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r0-r1}                     @ restore operands in reverse order
545ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cdcmple"       @ r0<- Z set if eq, C clear if <
546ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
5471465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
548ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                            @ r1<- 1 or -1 for NaN
5491465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
550ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
551ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
552ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
553ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
554ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPG_FLOAT
555ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_FLOAT:
556ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_FLOAT.S */
557ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */
558ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5591465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
560ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
561ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
562ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
563ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
564ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
565ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
566ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
567ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
568ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The operation we're implementing is:
569ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   if (x == y)
570ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 0;
571ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x < y)
572ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return -1;
573ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x > y)
574ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 1;
575ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else
576ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return {-1,1};  // one or both operands was NaN
577ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
578ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The straightforward implementation requires 3 calls to functions
579ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * that return a result in r0.  We can do it with two calls if our
580ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * EABI library supports __aeabi_cfcmple (only one if we want to check
581ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for NaN directly):
582ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check x <= y
583ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return -1
584ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if ==, return 0
585ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check y <= x
586ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return 1
587ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   return {-1,1}
588ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
589ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for: cmpl-float, cmpg-float
590ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
591ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
592ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r0                      @ Save copies - we may need to redo
593ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r10, r1
5941465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
595ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cfcmple"       @ cmp <=: C clear if <, Z set if eq
596ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r0<- -1
598ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r0<- 0, trumps less than
5991465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
600ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
601ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
602ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_FLOAT_gt_or_nan:
6041465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r0, r10                     @ restore in reverse order
6051465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r1, r9
606ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cfcmple"       @ r0<- Z set if eq, C clear if <
607ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
6081465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                            @ r1<- 1 or -1 for NaN
6101465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
612ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
613ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
614ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
616ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
617ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPL_FLOAT
618ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_FLOAT:
619ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */
620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
6211465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
622ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
623ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
624ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
625ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
626ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
627ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
628ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
629ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
630ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The operation we're implementing is:
631ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   if (x == y)
632ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 0;
633ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x < y)
634ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return -1;
635ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x > y)
636ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 1;
637ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else
638ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return {-1,1};  // one or both operands was NaN
639ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
640ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The straightforward implementation requires 3 calls to functions
641ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * that return a result in r0.  We can do it with two calls if our
642ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * EABI library supports __aeabi_cfcmple (only one if we want to check
643ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for NaN directly):
644ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check x <= y
645ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return -1
646ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if ==, return 0
647ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check y <= x
648ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return 1
649ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   return {-1,1}
650ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
651ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for: cmpl-float, cmpg-float
652ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
653ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
654ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r0                      @ Save copies - we may need to redo
655ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r10, r1
6561465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
657ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cfcmple"       @ cmp <=: C clear if <, Z set if eq
658ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
659ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r0<- -1
660ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r0<- 0, trumps less than
6611465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
662ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
663ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
664ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
665ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_FLOAT_gt_or_nan:
6661465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r0, r10                     @ restore in reverse order
6671465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r1, r9
668ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR ".L__aeabi_cfcmple"       @ r0<- Z set if eq, C clear if <
669ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
6701465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                            @ r1<- 1 or -1 for NaN
6721465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
673ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
675ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
676ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
677ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
678ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_MUL_LONG
679ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_MUL_LONG:
680ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_MUL_LONG.S */
681ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
682ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Signed 64-bit integer multiply.
683ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
684ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For JIT: op1 in r0/r1, op2 in r2/r3, return in r0/r1
685ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
686ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
687ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *        WX
688ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *      x YZ
689ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  --------
690ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     ZW ZX
691ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  YW YX
692ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
693ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The low word of the result holds ZX, the high word holds
694ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
695ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * it doesn't fit in the low 64 bits.
696ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
697ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Unlike most ARM math operations, multiply instructions have
698ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * restrictions on using the same register more than once (Rd and Rm
699ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * cannot be the same).
700ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
701ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* mul-long vAA, vBB, vCC */
702ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mul     ip, r2, r1                  @  ip<- ZxW
703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
704ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
705ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
706ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0,r9
707ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1,r10
708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
709ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
712ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_SHL_LONG
713ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHL_LONG:
714ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHL_LONG.S */
715ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
716ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
717ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
718ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
719ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
720ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
721ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* shl-long vAA, vBB, vCC */
722ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r2<- r2 & 0x3f
723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, asl r2              @  r1<- r1 << r2
724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
725ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
727ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
728ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, asl r2              @  r0<- r0 << r2
729ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
730ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
731ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
732ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
733ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_SHR_LONG
734ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHR_LONG:
735ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHR_LONG.S */
736ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
737ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
738ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
739ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
740ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
741ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
742ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* shr-long vAA, vBB, vCC */
743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r0<- r0 & 0x3f
744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
745ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
746ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
747ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
748ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
749ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, asr r2              @  r1<- r1 >> r2
750ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
751ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
752ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
753ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
754ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
755ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_USHR_LONG
756ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_USHR_LONG:
757ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_USHR_LONG.S */
758ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
759ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
760ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
761ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
762ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
763ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* ushr-long vAA, vBB, vCC */
765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r0<- r0 & 0x3f
766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
768ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
769ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
770ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
771ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
772ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
773ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
774ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
7754f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* ------------------------------ */
7764f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .balign 4
7774f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .global dvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON
7784f48917c0741e4d9b15ca7c45956aea05fea103fBen ChengdvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON:
7794f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* File: armv5te/TEMPLATE_THROW_EXCEPTION_COMMON.S */
7804f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    /*
7814f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * Throw an exception from JIT'ed code.
7824f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * On entry:
7834f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     *    r0    Dalvik PC that raises the exception
7844f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     */
7854f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    b       .LhandleException
7864f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
7871465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* ------------------------------ */
7881465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    .balign 4
7899e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .global dvmCompiler_TEMPLATE_MEM_OP_DECODE
7909e45c0b968d63ea38353c99252d233879c2efdafjeffhaodvmCompiler_TEMPLATE_MEM_OP_DECODE:
7919e45c0b968d63ea38353c99252d233879c2efdafjeffhao/* File: armv5te/TEMPLATE_MEM_OP_DECODE.S */
7929e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
7931465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    /*
7949e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler encapsulates heap memory ops for selfVerification mode.
7951465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     *
7969e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * The call to the handler is inserted prior to a heap memory operation.
7979e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler then calls a function to decode the memory op, and process
7989e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * it accordingly. Afterwards, the handler changes the return address to
7999e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * skip the memory op so it never gets executed.
8001465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     */
8019e45c0b968d63ea38353c99252d233879c2efdafjeffhao    push    {r0-r12,lr}                 @ save out all registers
8029e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r0, lr                      @ arg0 <- link register
8039e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r1, sp                      @ arg1 <- stack pointer
8049e45c0b968d63ea38353c99252d233879c2efdafjeffhao    ldr     r2, .LdvmSelfVerificationMemOpDecode @ defined in footer.S
8059e45c0b968d63ea38353c99252d233879c2efdafjeffhao    blx     r2                          @ decode and handle the mem op
8069e45c0b968d63ea38353c99252d233879c2efdafjeffhao    pop     {r0-r12,lr}                 @ restore all registers
8079e45c0b968d63ea38353c99252d233879c2efdafjeffhao    bx      lr                          @ return to compiled code
8089e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
8091465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
810fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
811fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
812fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_COMPARETO
813fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_COMPARETO:
814fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_COMPARETO.S */
815fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
816fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's compareTo.
817fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
818fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0/r1 to have been previously checked for null.  Will
819fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return negative if this's string is < comp, 0 if they are the
820fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * same and positive if >.
821fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
822fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
823fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
824fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
825fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync with definitions in UtfString.h.  See asm-constants.h
826fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
827fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
828fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   this object pointer
829fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   comp object pointer
830fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
831fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
832fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
833fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov    r2, r0         @ this to r2, opening up r0 for return value
834fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs   r0, r2, r1     @ Same?
835fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxeq   lr
836fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
837fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r4, [r2, #STRING_FIELDOFF_OFFSET]
838fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r9, [r1, #STRING_FIELDOFF_OFFSET]
839fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r2, #STRING_FIELDOFF_COUNT]
840fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r10, [r1, #STRING_FIELDOFF_COUNT]
841fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r2, [r2, #STRING_FIELDOFF_VALUE]
842fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r1, [r1, #STRING_FIELDOFF_VALUE]
843fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
844fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
845fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
846fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    value:  r2/r1
847fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    offset: r4/r9
848fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    count:  r7/r10
849fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * We're going to compute
850fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r11 <- countDiff
851fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r10 <- minCount
852fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
853fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     subs  r11, r7, r10
854fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movls r10, r7
855fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
856fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Now, build pointers to the string data */
857fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, r2, r4, lsl #1
858fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, r1, r9, lsl #1
859fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
860fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * Note: data pointers point to previous element so we can use pre-index
861fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * mode with base writeback.
862fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
863fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, #16-2   @ offset to contents[-1]
864fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, #16-2   @ offset to contents[-1]
865fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
866fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
867fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
868fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r2: *this string data
869fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r1: *comp string data
870fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r10: iteration count for comparison
871fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r11: value to return if the first part of the string is equal
872fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r0: reserved for result
873fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r3, r4, r7, r8, r9, r12 available for loading string data
874fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
875fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
8764c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #2
8774c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blt   do_remainder2
8784c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
8794c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee      /*
8804c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * Unroll the first two checks so we can quickly catch early mismatch
8814c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * on long strings (but preserve incoming alignment)
8824c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       */
8834c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
8844c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r3, [r2, #2]!
8854c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r4, [r1, #2]!
8864c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r7, [r2, #2]!
8874c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r8, [r1, #2]!
8884c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r0, r3, r4
8894c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subeqs  r0, r7, r8
8904c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  lr
8914c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r10, #28
8924c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bgt   do_memcmp16
8934c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #3
894fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    blt   do_remainder
8954c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
896fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_triple:
897fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
898fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
899fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r7, [r2, #2]!
900fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r8, [r1, #2]!
901fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r9, [r2, #2]!
902fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r12,[r1, #2]!
903fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
904fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r7, r8
905fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r9, r12
906fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
907fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #3
9085965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    bge   loopback_triple
909fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
910fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeedo_remainder:
9115965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    adds  r10, #3
912fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   returnDiff
913fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
914fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_single:
915fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
916fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
917fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
918fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
919fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #1
920fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bne     loopback_single
921fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
922fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeereturnDiff:
923fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, r11
924fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
925fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
9264c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_remainder2:
9274c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    adds  r10, #2
9284c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bne   loopback_single
9294c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r11
9304c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    lr
9314c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9324c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    /* Long string case */
9334c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_memcmp16:
9344c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r4, lr
9354c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldr   lr, .Lmemcmp16
9364c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r7, r11
9374c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r0, r2, #2
9384c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r1, r1, #2
9394c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r2, r10
9404c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blx   lr
9414c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r0, #0
9424c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  r4
9434c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r7
9444c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    r4
9454c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9464c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee.Lmemcmp16:
9474c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    .word __memcmp16
9484c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
949fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
950fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
951fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
952fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_INDEXOF
953fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_INDEXOF:
954fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_INDEXOF.S */
955fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
956fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's indexOf.
957fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
958fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0 to have been previously checked for null.  Will
959fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return index of match of r1 in r0.
960fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
961fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
962fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
963fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
964fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync wth definitions in UtfString.h  See asm-constants.h
965fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
966fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
967fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   string object pointer
968fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   char to match
969fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r2:   Starting offset in string data
970fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
971fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
972fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r0, #STRING_FIELDOFF_OFFSET]
973fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r8, [r0, #STRING_FIELDOFF_COUNT]
974fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r0, [r0, #STRING_FIELDOFF_VALUE]
975fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
976fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
977fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
97849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r0: object pointer
97949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r1: char to match
98049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r2: starting offset
98149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r7: offset
98249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r8: string length
983fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
984fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
98549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of string data */
98649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     add   r0, #16
98749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     add   r0, r0, r7, lsl #1
98849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
98949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Save a copy of starting data in r7 */
99049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     mov   r7, r0
99149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
992fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Clamp start to [0..count] */
993fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, #0
994fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movlt r2, #0
995fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, r8
99649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     movgt r2, r8
997fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
99849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of data to compare and pre-bias */
999fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r0, r0, r2, lsl #1
100049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r0, #2
100149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
100249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Compute iteration count */
100349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r8, r2
1004fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1005fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
1006fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
100749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r0: start of data to test
100849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r1: chat to compare
100949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r8: iteration count
101049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r7: original start of string
101149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r3, r4, r9, r10, r11, r12 available for loading string data
1012fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
1013fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1014ab875c79c56eacc510b09710d38a9b20f7337486Bill Buzbee    subs  r8, #4
101549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    blt   indexof_remainder
1016fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
101749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop4:
1018fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1019fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r0, #2]!
102049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r10, [r0, #2]!
102149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r11, [r0, #2]!
1022fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1023fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_0
1024fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r4, r1
1025fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_1
102649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r10, r1
1027fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_2
102849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r11, r1
1029fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1030fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #4
103149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bge   indexof_loop4
1032fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
103349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_remainder:
103449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    adds    r8, #4
103549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    beq     indexof_nomatch
1036fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
103749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop1:
1038fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1039fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1040fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1041fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #1
104249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bne   indexof_loop1
1043fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
104449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_nomatch:
1045fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, #-1
1046fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1047fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1048fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_0:
1049fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #6
105049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
105149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1052fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1053fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_1:
1054fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #4
105549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
105649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1057fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1058fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_2:
1059fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #2
106049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
106149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1062fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1063fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_3:
106449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
106549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1066fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1067fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1068fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
10699a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* ------------------------------ */
10709a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .balign 4
10719a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .global dvmCompiler_TEMPLATE_INTERPRET
10729a8c75adb2abf551d06dbf757bff558c1feded08Bill BuzbeedvmCompiler_TEMPLATE_INTERPRET:
10739a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* File: armv5te/TEMPLATE_INTERPRET.S */
10749a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
10759a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * This handler transfers control to the interpeter without performing
10769a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * any lookups.  It may be called either as part of a normal chaining
10779a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * operation, or from the transition code in header.S.  We distinquish
10789a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * the two cases by looking at the link register.  If called from a
10799a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * translation chain, it will point to the chaining Dalvik PC + 1.
10809a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * On entry:
10819a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    lr - if NULL:
10829a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *        r1 - the Dalvik PC to begin interpretation.
10839a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    else
10849a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *        [lr, #-1] contains Dalvik PC to begin interpretation
10859a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    rGLUE - pointer to interpState
10869a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    rFP - Dalvik frame pointer
10879a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
10889a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    cmp     lr, #0
10899a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldrne   r1,[lr, #-1]
10909a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr     r2, .LinterpPunt
10919a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r0, r1                       @ set Dalvik PC
10929a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bx      r2
10939a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    @ doesn't return
10949a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
10959a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee.LinterpPunt:
10969a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .word   dvmJitToInterpPunt
10979a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
1098c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1099c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1100c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER
1101c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER:
1102c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER.S */
1103c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1104c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Call out to the runtime to lock an object.  Because this thread
1105c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * may have been suspended in THREAD_MONITOR state and the Jit's
1106c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * translation cache subsequently cleared, we cannot return directly.
1107c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Instead, unconditionally transition to the interpreter to resume.
1108c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1109c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1110c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1111c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1112c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
111379842ac67e2a23cb544bfe1ee3961d325a2552e7Bill Buzbee     */
1114c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1115c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1116c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1117c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2                           @ dvmLockObject(self, obj)
1118c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ refresh Jit's on/off status
1119c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [rGLUE, #offGlue_ppJitProfTable]
1120c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [r0]
1121c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmJitToInterpNoChain
1122c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r0, [rGLUE, #offGlue_pJitProfTable]
1123c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1124eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#if defined(EXIT_STATS)
1125eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1126eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1127c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1128c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
1129c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
1130c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1131c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1132c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG
1133c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
1134c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER_DEBUG.S */
1135c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1136c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * To support deadlock prediction, this version of MONITOR_ENTER
1137c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * will always call the heavyweight dvmLockObject, check for an
1138c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * exception and then bail out to the interpreter.
1139c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1140c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1141c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1142c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1143c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
1144c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1145c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     */
1146c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1147c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1148c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1149c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2             @ dvmLockObject(self, obj)
1150c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ refresh Jit's on/off status & test for exception
1151c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [rGLUE, #offGlue_ppJitProfTable]
1152c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r1, [rGLUE, #offGlue_self]
1153c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [r0]
1154c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r1, [r1, #offThread_exception]
1155c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r0, [rGLUE, #offGlue_pJitProfTable]
1156c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    cmp     r1, #0
1157c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    beq     1f
1158c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LhandleException
1159c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    sub     r0, r4, #2     @ roll dPC back to this monitor instruction
1160c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1161c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee1:
1162c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1163eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#if defined(EXIT_STATS)
1164eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1165eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1166c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     pc, .LdvmJitToInterpNoChain
1167c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
1168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .size   dvmCompilerTemplateStart, .-dvmCompilerTemplateStart
1169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/footer.S */
1170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
1171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
1172ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *  Common subroutines and data
1173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
1174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
1175ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .text
1177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
1178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LinvokeNative:
1179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Prep for the native call
1180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall
1181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
11827a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
1183d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
11847a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ not in jit code cache
1185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
1186d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
1187d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
1188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r3                      @ r9<- glue->self (preserve)
1189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
1190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
1192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r1                      @ r0<- newFP
1193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
1194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR "[r2, #offMethod_nativeFunc]"
1196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1197964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    @ Refresh Jit's on/off status
1198964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable]
1199964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
1200ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ native return; r9=self, r10=newSaveArea
1201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ equivalent to dvmPopJniLocals
1202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
1203d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
1204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r1, [r9, #offThread_exception] @ check for exception
1205964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3]    @ r1 <- pointer to Jit profile table
1206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
1207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #0                      @ null?
1208d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
12094f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
1210964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable]  @ cache current JitProfTable
121160c24f436d603c564d5351a6f81821f12635733cBen Cheng
121260c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
121360c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
121460c24f436d603c564d5351a6f81821f12635733cBen Cheng
12157a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r9, #offThread_inJitCodeCache] @ set the new mode
121660c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
121760c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
121860c24f436d603c564d5351a6f81821f12635733cBen Cheng
121960c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
122040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
122160c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
12227a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#if defined(EXIT_STATS)
12237a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
12247a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
122560c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
1226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
12274f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/*
12284f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry:
12294f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0  Faulting Dalvik PC
12304f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */
1231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LhandleException:
12327a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
12337a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
12347a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ in interpreter land
12354f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func
1236cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    ldr     rIBASE, .LdvmAsmInstructionStart    @ same as above
12374f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     rPC, r0                 @ reload the faulting Dalvik address
12384f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     pc, r1                  @ branch to dvmMterpCommonExceptionThrown
1239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
1241ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmAsmInstructionStart:
1242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmAsmInstructionStart
124340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng.LdvmJitToInterpTraceSelectNoChain:
124440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .word   dvmJitToInterpTraceSelectNoChain
1245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmJitToInterpNoChain:
1246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmJitToInterpNoChain
1247ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmMterpStdBail:
1248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmMterpStdBail
1249cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng.LdvmMterpCommonExceptionThrown:
1250cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    .word   dvmMterpCommonExceptionThrown
1251c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee.LdvmLockObject:
1252c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .word   dvmLockObject
12539e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
12549e45c0b968d63ea38353c99252d233879c2efdafjeffhao.LdvmSelfVerificationMemOpDecode:
12559e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .word   dvmSelfVerificationMemOpDecode
12569e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
1257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cdcmple:
1258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cdcmple
1259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cfcmple:
1260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cfcmple
1261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dmvCompilerTemplateEnd
1263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdmvCompilerTemplateEnd:
1264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1265ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /* WITH_JIT */
1266ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1267