CompilerTemplateAsm-armv5te.S revision 18fba346582c08d81aa96d9508c0e935bad5f36f
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/* File: armv5te/platform.S */
105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
107342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee *  CPU-version-specific defines and utility
108ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
109ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompilerTemplateStart
113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .type   dvmCompilerTemplateStart, %function
114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .text
115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompilerTemplateStart:
117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMP_LONG
121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMP_LONG:
122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMP_LONG.S */
123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * register based on the results of the comparison.
126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * We load the full values with LDM, but in practice many values could
128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * be resolved by only looking at the high word.  This could be made
129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * faster or slower by splitting the LDM into a pair of LDRs.
130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
131ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * If we just wanted to set condition flags, we could do this:
132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  subs    ip, r0, r2
133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  sbcs    ip, r1, r3
134ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  subeqs  ip, r0, r2
135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * integer value, which we can do with 2 conditional mov/mvn instructions
137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * (set 1, set -1; if they're equal we already have 0 in ip), giving
138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * us a constant 5-cycle path plus a branch at the end to the
139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * instruction epilogue code.  The multi-compare approach below needs
140ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * in the worst case (the 64-bit values are equal).
142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* cmp-long vAA, vBB, vCC */
144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
145ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blt     .LTEMPLATE_CMP_LONG_less            @ signed compare on high part
146ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bgt     .LTEMPLATE_CMP_LONG_greater
147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    r0, r0, r2                  @ r0<- r0 - r2
148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxeq     lr
149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMP_LONG_greater         @ unsigned compare on low part
150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMP_LONG_less:
151ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                      @ r0<- -1
152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMP_LONG_greater:
154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                      @ r0<- 1
155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_RETURN
160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_RETURN:
161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_RETURN.S */
162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX.
164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * If the stored value in returnAddr
165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * is non-zero, the caller is compiled by the JIT thus return to the
166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * address in the code cache following the invoke instruction. Otherwise
167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * return to the special dvmJitToInterpNoChain entry point.
168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
16918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
1705cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r2,lr}             @ preserve live registers
1715cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r6
1725cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    @ r0=rGlue
17313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
17413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastJavaMethodTraceExit
1755cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r2,lr}             @ restore live registers
1765cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r10, [r0, #offStackSaveArea_prevFrame] @ r10<- saveArea->prevFrame
179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     rPC, [r0, #offStackSaveArea_savedPc] @ rPC<- saveArea->savedPc
18197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9,  [r0, #offStackSaveArea_returnAddr] @ r9<- chaining cell ret
18397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
18497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r9, #0                      @ disable chaining
18597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
186ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)]
187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                                        @ r2<- method we're returning to
188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r2, #0                      @ break frame?
19097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq     1f                          @ bail to interpreter
19297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
19397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    blxeq   lr                          @ punt to interpreter and compare state
19497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
1957a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr     r1, .LdvmJitToInterpNoChainNoProfile @ defined in footer.S
196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r10                    @ publish new FP
1978c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
198ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [r8]                    @ r8<- suspendCount
199ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
200ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
2016c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r3, #offThread_curFrame] @ self->curFrame = fp
203ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
2046c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    str     r0, [rGLUE, #offGlue_methodClassDex]
205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r8, #0                      @ check the suspendCount
206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movne   r9, #0                      @ clear the chaining cell address
2077a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r9, [r3, #offThread_inJitCodeCache] @ in code cache or not
208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r9, #0                      @ chaining cell exists?
209ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blxne   r9                          @ jump to the chaining cell
210978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
2116c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     r0, #kCallsiteInterpreted
2126c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif
2136c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     pc, r1                      @ callsite is interpreted
214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    stmia   rGLUE, {rPC, rFP}           @ SAVE_PC_FP_TO_GLUE()
216ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, .LdvmMterpStdBail       @ defined in footer.S
217ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, #0                      @ changeInterp = false
218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, rGLUE                   @ Expecting rGLUE in r0
219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blx     r2                          @ exit the interpreter
220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT
224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */
226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * runtime-resolved callee.
230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
241964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r8, [r8]                    @ r8<- suspendCount (int)
242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
243a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    lr                          @ return to raise stack overflow excep.
244ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
247ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ set up newSaveArea
253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
254ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r8, #0                      @ suspendCount != 0
257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    lr                          @ bail to the interpreter
258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    tst     r10, #ACC_NATIVE
25997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .LinvokeNative
26197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
26297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bxne    lr                          @ bail to the interpreter
26397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
26540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
266ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
267ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
268ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
269ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Update "glue" values for the new method
270ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
272ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
273ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r2, #offThread_curFrame]  @ self->curFrame = newFp
27418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
2755cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}                    @ preserve r0-r3
2765cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
2775cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    @ r0=methodToCall, r1=rGlue
27813fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
27913fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
2805cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}                    @ restore r0-r3
2815cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
282ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
283ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Start executing the callee
284978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
2856c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     r0, #kInlineCacheMiss
2866c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif
28740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
288ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
290ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
291ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN
292ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN:
293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */
294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
295ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For monomorphic callsite, setup the Dalvik frame and return to the
296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Thumb code through the link register to transfer control to the callee
297ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * method through a dedicated chaining cell.
298ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
299c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize
300c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ rPC = dalvikCallsite, r7 = methodToCall->registersSize
30138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ methodToCall is guaranteed to be non-native
30238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng.LinvokeChain:
303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
305ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
308ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
309ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r12, lr, #2                 @ setup the punt-to-interp address
310ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
311964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r8, [r8]                    @ r8<- suspendCount (int)
312ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
313a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    r12                         @ return to raise stack overflow excep.
314ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
315ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
316ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
317ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
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
33418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
3355cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
3365cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
3375cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    @ r0=methodToCall, r1=rGlue
33813fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
33913fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
3405cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r2,lr}             @ restore registers
3415cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
342ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
343ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr                              @ return to the callee-chaining cell
344ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
345ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
346ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
34738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN
34838329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN:
34938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */
35038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    /*
35138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * For polymorphic callsite, check whether the cached class pointer matches
35238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * the current one. If so setup the Dalvik frame and return to the
35338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * Thumb code through the link register to transfer control to the callee
35438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * method through a dedicated chaining cell.
35538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
35689efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee     * The predicted chaining cell is declared in ArmLIR.h with the
35738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * following layout:
35838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
35938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *  typedef struct PredictedChainingCell {
36038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      u4 branch;
36138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      const ClassObject *clazz;
36238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      const Method *method;
36338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      u4 counter;
36438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *  } PredictedChainingCell;
36538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
36638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * Upon returning to the callsite:
36738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr  : to branch to the chaining cell
36838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr+2: to punt to the interpreter
36938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr+4: to fully resolve the callee and may rechain.
37038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *            r3 <- class
37138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *            r9 <- counter
37238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     */
37338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite
37438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r3, [r0, #offObject_clazz]  @ r3 <- this->class
37538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r2, #4]    @ r8 <- predictedChainCell->clazz
37638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r0, [r2, #8]    @ r0 <- predictedChainCell->method
377b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    ldr     r9, [rGLUE, #offGlue_icRechainCount]   @ r1 <- shared rechainCount
37838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r3, r8          @ predicted class == actual class?
379978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
380978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    ldr     r7, .LdvmICHitCount
3818c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#if defined(WORKAROUND_CORTEX_A9_745320)
3828c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    /* Don't use conditional loads if the HW defect exists */
3838c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    bne     101f
3848c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r10, [r7, #0]
3858c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng101:
3868c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#else
387978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    ldreq   r10, [r7, #0]
3888c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#endif
389978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    add     r10, r10, #1
390978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    streq   r10, [r7, #0]
391978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#endif
392c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    ldreqh  r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
393c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    ldreqh  r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
39438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    beq     .LinvokeChain   @ predicted chain is valid
39538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r7, [r3, #offClassObject_vtable] @ r7 <- this->class->vtable
396b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    cmp     r8, #0          @ initialized class or not
397b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    moveq   r1, #0
398b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    subne   r1, r9, #1      @ count--
399b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    strne   r1, [rGLUE, #offGlue_icRechainCount]   @ write back to InterpState
40038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     lr, lr, #4      @ return to fully-resolve landing pad
40138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    /*
40238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r1 <- count
40338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r2 <- &predictedChainCell
40438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r3 <- this->class
40538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r4 <- dPC
40638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r7 <- this->class->vtable
40738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     */
40838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bx      lr
40938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
41038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */
41138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .balign 4
41238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE
41338329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE:
41438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */
41538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
416c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ r7 = methodToCall->registersSize
41738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
41838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
41938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
42038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
42138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
42238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
42338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r8]                    @ r3<- suspendCount (int)
42438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
425a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    lr                          @ return to raise stack overflow excep.
42638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
42738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
42838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
42938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
43038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ set up newSaveArea
43138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
43238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
43338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
43438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
43538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r8, #0                      @ suspendCount != 0
43638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
43797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
43838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bxne    lr                          @ bail to the interpreter
43997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
44097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bx      lr                          @ bail to interpreter unconditionally
44197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
44238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
44338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ go ahead and transfer control to the native code
444d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
4457a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
44638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
4477a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ not in the jit code cache
448d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
449d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
45038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r9, r3                      @ r9<- glue->self (preserve)
45138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
45238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
45338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
45438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r0, r1                      @ r0<- newFP
45538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
45618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
4575cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    @ r2=methodToCall, r6=rGLUE
4585cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r2,r6}                @ to be consumed after JNI return
4595cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}                @ preserve r0-r3
4605cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r2
4615cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
4625cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    @ r0=JNIMethod, r1=rGlue
46313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
46413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
4655cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}                @ restore r0-r3
4665cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
46738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
46838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    blx     r8                          @ off to the native code
46938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
47018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
4715cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r1}                @ restore r2 and r6
4725cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    @ r0=JNIMethod, r1=rGlue
47313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
47413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastNativeMethodTraceExit
4755cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
47638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ native return; r9=self, r10=newSaveArea
47738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ equivalent to dvmPopJniLocals
47838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
479d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
48038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r1, [r9, #offThread_exception] @ check for exception
48138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
48238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r1, #0                      @ null?
483d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
484909b418219f63c0d0b2bde8a0835dbf27d5061b8Bill Buzbee    ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
48560c24f436d603c564d5351a6f81821f12635733cBen Cheng
48660c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
48760c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
48860c24f436d603c564d5351a6f81821f12635733cBen Cheng
4897a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r9, #offThread_inJitCodeCache] @ set the mode properly
49060c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
49160c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
49260c24f436d603c564d5351a6f81821f12635733cBen Cheng
49360c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
49440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
49560c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
496978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
4977a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
4987a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
49960c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
50060c24f436d603c564d5351a6f81821f12635733cBen Cheng
50138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */
50238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .balign 4
503ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPG_DOUBLE
504ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_DOUBLE:
505ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_DOUBLE.S */
506ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */
507ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5081465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
509ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
510ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
511ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
512ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
514ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
515ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
516ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
517ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * See OP_CMPL_FLOAT for an explanation.
518ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
519ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For: cmpl-double, cmpg-double
520ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
521ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
5221465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    push    {r0-r3}                     @ save operands
5231465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
52413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
52513fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cdcmple       @ PIC way of "bl __aeabi_cdcmple"
526ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
527ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r1<- -1
528ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r1<- 0, trumps less than
5291465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    add     sp, #16                     @ drop unused operands
5301465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
531ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
532ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
533ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
534ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
535ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_DOUBLE_gt_or_nan:
5361465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r2-r3}                     @ restore operands in reverse order
5371465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r0-r1}                     @ restore operands in reverse order
53813fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
53913fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cdcmple       @ r0<- Z set if eq, C clear if <
540ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
5411465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
542ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                            @ r1<- 1 or -1 for NaN
5431465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
544ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
545ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
546ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
547ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
548ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPL_DOUBLE
549ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_DOUBLE:
550ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */
551ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5521465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
553ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
554ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
555ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
556ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
557ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
558ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
559ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
560ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
561ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * See OP_CMPL_FLOAT for an explanation.
562ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
563ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For: cmpl-double, cmpg-double
564ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
565ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
5661465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    push    {r0-r3}                     @ save operands
5671465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
56813fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
56913fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cdcmple       @ PIC way of "bl __aeabi_cdcmple"
570ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
571ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r1<- -1
572ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r1<- 0, trumps less than
5731465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    add     sp, #16                     @ drop unused operands
5741465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
575ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
576ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
577ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
578ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
579ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_DOUBLE_gt_or_nan:
5801465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r2-r3}                     @ restore operands in reverse order
5811465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r0-r1}                     @ restore operands in reverse order
58213fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
58313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cdcmple       @ r0<- Z set if eq, C clear if <
584ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
5851465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
586ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                            @ r1<- 1 or -1 for NaN
5871465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
588ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
589ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
590ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
591ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPG_FLOAT
592ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_FLOAT:
593ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_FLOAT.S */
594ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */
595ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5961465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
598ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
599ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
600ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
601ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
602ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
604ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
605ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The operation we're implementing is:
606ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   if (x == y)
607ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 0;
608ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x < y)
609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return -1;
610ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x > y)
611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 1;
612ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else
613ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return {-1,1};  // one or both operands was NaN
614ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The straightforward implementation requires 3 calls to functions
616ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * that return a result in r0.  We can do it with two calls if our
617ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * EABI library supports __aeabi_cfcmple (only one if we want to check
618ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for NaN directly):
619ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check x <= y
620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return -1
621ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if ==, return 0
622ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check y <= x
623ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return 1
624ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   return {-1,1}
625ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
626ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for: cmpl-float, cmpg-float
627ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
628ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
629ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r0                      @ Save copies - we may need to redo
630ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r10, r1
6311465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
63213fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
63313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cfcmple       @ cmp <=: C clear if <, Z set if eq
634ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
635ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r0<- -1
636ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r0<- 0, trumps less than
6371465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
638ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
639ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
640ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
641ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_FLOAT_gt_or_nan:
6421465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r0, r10                     @ restore in reverse order
6431465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r1, r9
64413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
64513fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cfcmple       @ r0<- Z set if eq, C clear if <
646ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
6471465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
648ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                            @ r1<- 1 or -1 for NaN
6491465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
650ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
651ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
652ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
653ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
654ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPL_FLOAT
655ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_FLOAT:
656ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */
657ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
6581465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
659ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
660ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
661ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
662ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
663ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
664ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
665ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
666ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
667ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The operation we're implementing is:
668ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   if (x == y)
669ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 0;
670ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x < y)
671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return -1;
672ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x > y)
673ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 1;
674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else
675ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return {-1,1};  // one or both operands was NaN
676ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
677ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The straightforward implementation requires 3 calls to functions
678ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * that return a result in r0.  We can do it with two calls if our
679ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * EABI library supports __aeabi_cfcmple (only one if we want to check
680ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for NaN directly):
681ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check x <= y
682ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return -1
683ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if ==, return 0
684ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check y <= x
685ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return 1
686ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   return {-1,1}
687ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
688ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for: cmpl-float, cmpg-float
689ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
690ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
691ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r0                      @ Save copies - we may need to redo
692ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r10, r1
6931465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
69413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
69513fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cfcmple       @ cmp <=: C clear if <, Z set if eq
696ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
697ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r0<- -1
698ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r0<- 0, trumps less than
6991465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
700ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
701ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
702ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_FLOAT_gt_or_nan:
7041465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r0, r10                     @ restore in reverse order
7051465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r1, r9
70613fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
70713fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .L__aeabi_cfcmple       @ r0<- Z set if eq, C clear if <
708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
7091465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                            @ r1<- 1 or -1 for NaN
7111465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
712ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
713ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
714ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
715ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_MUL_LONG
716ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_MUL_LONG:
717ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_MUL_LONG.S */
718ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
719ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Signed 64-bit integer multiply.
720ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
721ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For JIT: op1 in r0/r1, op2 in r2/r3, return in r0/r1
722ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *        WX
725ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *      x YZ
726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  --------
727ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     ZW ZX
728ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  YW YX
729ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
730ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The low word of the result holds ZX, the high word holds
731ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
732ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * it doesn't fit in the low 64 bits.
733ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
734ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Unlike most ARM math operations, multiply instructions have
735ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * restrictions on using the same register more than once (Rd and Rm
736ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * cannot be the same).
737ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
738ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* mul-long vAA, vBB, vCC */
739ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mul     ip, r2, r1                  @  ip<- ZxW
740ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
741ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
742ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0,r9
744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1,r10
745ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
746ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
747ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
748ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
749ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_SHL_LONG
750ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHL_LONG:
751ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHL_LONG.S */
752ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
753ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
754ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
755ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
756ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
757ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
758ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* shl-long vAA, vBB, vCC */
759ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r2<- r2 & 0x3f
760ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, asl r2              @  r1<- r1 << r2
761ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
762ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
763ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, asl r2              @  r0<- r0 << r2
766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
768ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
769ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
770ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_SHR_LONG
771ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHR_LONG:
772ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHR_LONG.S */
773ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
774ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
775ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
776ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
777ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
778ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
779ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* shr-long vAA, vBB, vCC */
780ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r0<- r0 & 0x3f
781ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
782ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
783ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
784ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
785ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
786ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, asr r2              @  r1<- r1 >> r2
787ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
788ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
789ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
790ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
791ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_USHR_LONG
792ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_USHR_LONG:
793ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_USHR_LONG.S */
794ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
795ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
797ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
798ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
799ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
800ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* ushr-long vAA, vBB, vCC */
801ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r0<- r0 & 0x3f
802ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
803ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
804ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
805ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
806ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
807ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
808ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
809ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
8104f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* ------------------------------ */
8114f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .balign 4
8124f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .global dvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON
8134f48917c0741e4d9b15ca7c45956aea05fea103fBen ChengdvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON:
8144f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* File: armv5te/TEMPLATE_THROW_EXCEPTION_COMMON.S */
8154f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    /*
8164f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * Throw an exception from JIT'ed code.
8174f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * On entry:
8184f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     *    r0    Dalvik PC that raises the exception
8194f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     */
8204f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    b       .LhandleException
8214f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
8221465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* ------------------------------ */
8231465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    .balign 4
8249e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .global dvmCompiler_TEMPLATE_MEM_OP_DECODE
8259e45c0b968d63ea38353c99252d233879c2efdafjeffhaodvmCompiler_TEMPLATE_MEM_OP_DECODE:
8269e45c0b968d63ea38353c99252d233879c2efdafjeffhao/* File: armv5te/TEMPLATE_MEM_OP_DECODE.S */
8279e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
8281465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    /*
8299e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler encapsulates heap memory ops for selfVerification mode.
8301465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     *
8319e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * The call to the handler is inserted prior to a heap memory operation.
8329e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler then calls a function to decode the memory op, and process
8339e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * it accordingly. Afterwards, the handler changes the return address to
8349e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * skip the memory op so it never gets executed.
8351465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     */
8369e45c0b968d63ea38353c99252d233879c2efdafjeffhao    push    {r0-r12,lr}                 @ save out all registers
8379e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r0, lr                      @ arg0 <- link register
8389e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r1, sp                      @ arg1 <- stack pointer
8399e45c0b968d63ea38353c99252d233879c2efdafjeffhao    ldr     r2, .LdvmSelfVerificationMemOpDecode @ defined in footer.S
8409e45c0b968d63ea38353c99252d233879c2efdafjeffhao    blx     r2                          @ decode and handle the mem op
8419e45c0b968d63ea38353c99252d233879c2efdafjeffhao    pop     {r0-r12,lr}                 @ restore all registers
8429e45c0b968d63ea38353c99252d233879c2efdafjeffhao    bx      lr                          @ return to compiled code
8439e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
8441465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
845fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
846fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
847fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_COMPARETO
848fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_COMPARETO:
849fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_COMPARETO.S */
850fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
851fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's compareTo.
852fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
853fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0/r1 to have been previously checked for null.  Will
854fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return negative if this's string is < comp, 0 if they are the
855fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * same and positive if >.
856fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
857fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
858fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
859fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
860fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync with definitions in UtfString.h.  See asm-constants.h
861fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
862fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
863fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   this object pointer
864fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   comp object pointer
865fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
866fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
867fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
868fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov    r2, r0         @ this to r2, opening up r0 for return value
869fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs   r0, r2, r1     @ Same?
870fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxeq   lr
871fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
872fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r4, [r2, #STRING_FIELDOFF_OFFSET]
873fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r9, [r1, #STRING_FIELDOFF_OFFSET]
874fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r2, #STRING_FIELDOFF_COUNT]
875fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r10, [r1, #STRING_FIELDOFF_COUNT]
876fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r2, [r2, #STRING_FIELDOFF_VALUE]
877fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r1, [r1, #STRING_FIELDOFF_VALUE]
878fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
879fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
880fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
881fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    value:  r2/r1
882fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    offset: r4/r9
883fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    count:  r7/r10
884fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * We're going to compute
885fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r11 <- countDiff
886fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r10 <- minCount
887fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
888fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     subs  r11, r7, r10
889fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movls r10, r7
890fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
891fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Now, build pointers to the string data */
892fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, r2, r4, lsl #1
893fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, r1, r9, lsl #1
894fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
895fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * Note: data pointers point to previous element so we can use pre-index
896fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * mode with base writeback.
897fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
898fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, #16-2   @ offset to contents[-1]
899fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, #16-2   @ offset to contents[-1]
900fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
901fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
902fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
903fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r2: *this string data
904fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r1: *comp string data
905fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r10: iteration count for comparison
906fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r11: value to return if the first part of the string is equal
907fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r0: reserved for result
908fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r3, r4, r7, r8, r9, r12 available for loading string data
909fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
910fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
9114c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #2
9124c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blt   do_remainder2
9134c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9144c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee      /*
9154c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * Unroll the first two checks so we can quickly catch early mismatch
9164c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * on long strings (but preserve incoming alignment)
9174c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       */
9184c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9194c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r3, [r2, #2]!
9204c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r4, [r1, #2]!
9214c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r7, [r2, #2]!
9224c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r8, [r1, #2]!
9234c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r0, r3, r4
9244c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subeqs  r0, r7, r8
9254c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  lr
9264c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r10, #28
9274c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bgt   do_memcmp16
9284c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #3
929fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    blt   do_remainder
9304c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
931fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_triple:
932fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
933fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
934fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r7, [r2, #2]!
935fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r8, [r1, #2]!
936fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r9, [r2, #2]!
937fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r12,[r1, #2]!
938fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
939fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r7, r8
940fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r9, r12
941fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
942fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #3
9435965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    bge   loopback_triple
944fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
945fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeedo_remainder:
9465965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    adds  r10, #3
947fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   returnDiff
948fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
949fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_single:
950fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
951fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
952fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
953fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
954fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #1
955fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bne     loopback_single
956fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
957fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeereturnDiff:
958fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, r11
959fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
960fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
9614c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_remainder2:
9624c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    adds  r10, #2
9634c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bne   loopback_single
9644c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r11
9654c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    lr
9664c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9674c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    /* Long string case */
9684c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_memcmp16:
9694c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r4, lr
9704c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldr   lr, .Lmemcmp16
9714c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r7, r11
9724c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r0, r2, #2
9734c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r1, r1, #2
9744c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r2, r10
9754c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blx   lr
9764c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r0, #0
9774c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  r4
9784c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r7
9794c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    r4
9804c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9814c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee.Lmemcmp16:
9824c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    .word __memcmp16
9834c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
984fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
985fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
986fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_INDEXOF
987fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_INDEXOF:
988fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_INDEXOF.S */
989fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
990fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's indexOf.
991fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
992fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0 to have been previously checked for null.  Will
993fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return index of match of r1 in r0.
994fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
995fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
996fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
997fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
998fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync wth definitions in UtfString.h  See asm-constants.h
999fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1000fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
1001fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   string object pointer
1002fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   char to match
1003fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r2:   Starting offset in string data
1004fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
1005fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1006fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r0, #STRING_FIELDOFF_OFFSET]
1007fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r8, [r0, #STRING_FIELDOFF_COUNT]
1008fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r0, [r0, #STRING_FIELDOFF_VALUE]
1009fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1010fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
1011fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
101249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r0: object pointer
101349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r1: char to match
101449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r2: starting offset
101549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r7: offset
101649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r8: string length
1017fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
1018fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
101949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of string data */
102049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     add   r0, #16
102149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     add   r0, r0, r7, lsl #1
102249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
102349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Save a copy of starting data in r7 */
102449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     mov   r7, r0
102549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
1026fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Clamp start to [0..count] */
1027fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, #0
1028fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movlt r2, #0
1029fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, r8
103049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     movgt r2, r8
1031fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
103249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of data to compare and pre-bias */
1033fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r0, r0, r2, lsl #1
103449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r0, #2
103549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
103649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Compute iteration count */
103749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r8, r2
1038fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1039fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
1040fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
104149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r0: start of data to test
104249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r1: chat to compare
104349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r8: iteration count
104449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r7: original start of string
104549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r3, r4, r9, r10, r11, r12 available for loading string data
1046fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
1047fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1048ab875c79c56eacc510b09710d38a9b20f7337486Bill Buzbee    subs  r8, #4
104949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    blt   indexof_remainder
1050fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
105149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop4:
1052fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1053fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r0, #2]!
105449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r10, [r0, #2]!
105549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r11, [r0, #2]!
1056fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1057fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_0
1058fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r4, r1
1059fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_1
106049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r10, r1
1061fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_2
106249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r11, r1
1063fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1064fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #4
106549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bge   indexof_loop4
1066fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
106749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_remainder:
106849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    adds    r8, #4
106949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    beq     indexof_nomatch
1070fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
107149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop1:
1072fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1073fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1074fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1075fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #1
107649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bne   indexof_loop1
1077fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
107849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_nomatch:
1079fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, #-1
1080fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1081fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1082fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_0:
1083fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #6
108449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
108549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1086fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1087fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_1:
1088fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #4
108949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
109049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1091fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1092fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_2:
1093fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #2
109449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
109549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1096fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1097fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_3:
109849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
109949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1100fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1101fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
11029a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* ------------------------------ */
11039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .balign 4
11049a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .global dvmCompiler_TEMPLATE_INTERPRET
11059a8c75adb2abf551d06dbf757bff558c1feded08Bill BuzbeedvmCompiler_TEMPLATE_INTERPRET:
11069a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* File: armv5te/TEMPLATE_INTERPRET.S */
11079a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
11089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * This handler transfers control to the interpeter without performing
11099a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * any lookups.  It may be called either as part of a normal chaining
11109a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * operation, or from the transition code in header.S.  We distinquish
11119a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * the two cases by looking at the link register.  If called from a
1112bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee     * translation chain, it will point to the chaining Dalvik PC -3.
11139a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * On entry:
11149a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    lr - if NULL:
11159a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *        r1 - the Dalvik PC to begin interpretation.
11169a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    else
1117bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee     *        [lr, #3] contains Dalvik PC to begin interpretation
11189a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    rGLUE - pointer to interpState
11199a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    rFP - Dalvik frame pointer
11209a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
11219a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    cmp     lr, #0
11228c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#if defined(WORKAROUND_CORTEX_A9_745320)
11238c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    /* Don't use conditional loads if the HW defect exists */
11248c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    beq     101f
11258c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r1,[lr, #3]
11268c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng101:
11278c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#else
1128bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee    ldrne   r1,[lr, #3]
11298c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#endif
11309a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr     r2, .LinterpPunt
11319a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r0, r1                       @ set Dalvik PC
11329a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bx      r2
11339a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    @ doesn't return
11349a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
11359a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee.LinterpPunt:
11369a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .word   dvmJitToInterpPunt
11379a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
1138c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1139c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1140c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER
1141c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER:
1142c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER.S */
1143c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1144c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Call out to the runtime to lock an object.  Because this thread
1145c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * may have been suspended in THREAD_MONITOR state and the Jit's
1146c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * translation cache subsequently cleared, we cannot return directly.
1147c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Instead, unconditionally transition to the interpreter to resume.
1148c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1149c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1150c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1151c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1152c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
115379842ac67e2a23cb544bfe1ee3961d325a2552e7Bill Buzbee     */
1154c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1155c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1156c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1157c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2                           @ dvmLockObject(self, obj)
1158c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ refresh Jit's on/off status
1159c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [rGLUE, #offGlue_ppJitProfTable]
1160c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [r0]
1161c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmJitToInterpNoChain
1162c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r0, [rGLUE, #offGlue_pJitProfTable]
1163c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1164978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1165eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1166eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1167c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1168c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
1169c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1170c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1171c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG
1172c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
1173c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER_DEBUG.S */
1174c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1175c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * To support deadlock prediction, this version of MONITOR_ENTER
1176c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * will always call the heavyweight dvmLockObject, check for an
1177c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * exception and then bail out to the interpreter.
1178c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1179c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1180c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1181c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1182c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
1183c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1184c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     */
1185c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1186c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1187c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1188c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2             @ dvmLockObject(self, obj)
1189c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ refresh Jit's on/off status & test for exception
1190c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [rGLUE, #offGlue_ppJitProfTable]
1191c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r1, [rGLUE, #offGlue_self]
1192c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r0, [r0]
1193c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r1, [r1, #offThread_exception]
1194c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r0, [rGLUE, #offGlue_pJitProfTable]
1195c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    cmp     r1, #0
1196c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    beq     1f
1197c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LhandleException
1198c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    sub     r0, r4, #2     @ roll dPC back to this monitor instruction
1199c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1200c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee1:
1201c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1202978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1203eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1204eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1205c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     pc, .LdvmJitToInterpNoChain
1206c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
12072e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* ------------------------------ */
12082e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .balign 4
12092e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .global dvmCompiler_TEMPLATE_PERIODIC_PROFILING
12102e152baec01433de9c63633ebc6f4adf1cea3a87buzbeedvmCompiler_TEMPLATE_PERIODIC_PROFILING:
12112e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* File: armv5te/TEMPLATE_PERIODIC_PROFILING.S */
12122e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    /*
12132e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * Increment profile counter for this trace, and decrement
12142e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * sample counter.  If sample counter goes below zero, turn
12152e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * off profiling.
12162e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *
12172e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * On entry
12182e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * (lr-11) is address of pointer to counter.  Note: the counter
12192e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *    actually exists 10 bytes before the return target, but because
12202e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *    we are arriving from thumb mode, lr will have its low bit set.
12212e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     */
12222e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r0, [lr,#-11]
12232e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r1, [rGLUE, #offGlue_pProfileCountdown]
12242e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r2, [r0]                    @ get counter
12252e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r3, [r1]                    @ get countdown timer
12262e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     add    r2, #1
12272e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     subs   r2, #1
12282e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     blt    .LTEMPLATE_PERIODIC_PROFILING_disable_profiling
12292e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     str    r2, [r0]
12302e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     str    r3, [r1]
12312e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     bx     lr
12322e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
12332e152baec01433de9c63633ebc6f4adf1cea3a87buzbee.LTEMPLATE_PERIODIC_PROFILING_disable_profiling:
12342e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     mov    r4, lr                     @ preserve lr
12352e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r0, .LdvmJitTraceProfilingOff
12362e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     blx    r0
12372e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     bx     r4
12382e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
123918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
124018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
124118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_RETURN_PROF
124218fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_RETURN_PROF:
124318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_RETURN_PROF.S */
124418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
124518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_RETURN.S */
124618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
124718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX.
124818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * If the stored value in returnAddr
124918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * is non-zero, the caller is compiled by the JIT thus return to the
125018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * address in the code cache following the invoke instruction. Otherwise
125118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * return to the special dvmJitToInterpNoChain entry point.
125218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
125318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
125418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r2,lr}             @ preserve live registers
125518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, r6
125618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0=rGlue
125718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
125818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastJavaMethodTraceExit
125918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r2,lr}             @ restore live registers
126018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
126118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
126218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r0, #offStackSaveArea_prevFrame] @ r10<- saveArea->prevFrame
126318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
126418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     rPC, [r0, #offStackSaveArea_savedPc] @ rPC<- saveArea->savedPc
126518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
126618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9,  [r0, #offStackSaveArea_returnAddr] @ r9<- chaining cell ret
126718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
126818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r9, #0                      @ disable chaining
126918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
127018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)]
127118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee                                        @ r2<- method we're returning to
127218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
127318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r2, #0                      @ break frame?
127418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
127518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     1f                          @ bail to interpreter
127618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
127718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blxeq   lr                          @ punt to interpreter and compare state
127818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
127918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r1, .LdvmJitToInterpNoChainNoProfile @ defined in footer.S
128018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r10                    @ publish new FP
128118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
128218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r8]                    @ r8<- suspendCount
128318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
128418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method
128518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
128618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r3, #offThread_curFrame] @ self->curFrame = fp
128718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
128818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [rGLUE, #offGlue_methodClassDex]
128918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r8, #0                      @ check the suspendCount
129018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    movne   r9, #0                      @ clear the chaining cell address
129118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r9, [r3, #offThread_inJitCodeCache] @ in code cache or not
129218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r9, #0                      @ chaining cell exists?
129318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blxne   r9                          @ jump to the chaining cell
129418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
129518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kCallsiteInterpreted
129618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
129718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r1                      @ callsite is interpreted
129818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee1:
129918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmia   rGLUE, {rPC, rFP}           @ SAVE_PC_FP_TO_GLUE()
130018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, .LdvmMterpStdBail       @ defined in footer.S
130118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, #0                      @ changeInterp = false
130218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, rGLUE                   @ Expecting rGLUE in r0
130318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blx     r2                          @ exit the interpreter
130418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
130518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
130618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
130718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
130818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
130918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT_PROF
131018fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT_PROF:
131118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT_PROF.S */
131218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
131318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */
131418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
131518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
131618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
131718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * runtime-resolved callee.
131818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
131918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
132018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
132118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
132218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
132318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
132418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
132518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
132618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
132718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
132818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
132918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r8]                    @ r8<- suspendCount (int)
133018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
133118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    lr                          @ return to raise stack overflow excep.
133218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
133318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
133418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
133518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
133618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
133718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
133818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
133918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
134018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
134118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
134218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
134318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
134418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r8, #0                      @ suspendCount != 0
134518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
134618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    tst     r10, #ACC_NATIVE
134718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
134818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     .LinvokeNative
134918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
135018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
135118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
135218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
135318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
135418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
135518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
135618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
135718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ Update "glue" values for the new method
135818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
135918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
136018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r1                         @ fp = newFp
136118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r2, #offThread_curFrame]  @ self->curFrame = newFp
136218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
136318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r3}                    @ preserve r0-r3
136418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
136518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0=methodToCall, r1=rGlue
136618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
136718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastMethodTraceEnter
136818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r3}                    @ restore r0-r3
136918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
137018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
137118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ Start executing the callee
137218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
137318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kInlineCacheMiss
137418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
137518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
137618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
137718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
137818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
137918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
138018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
138118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN_PROF
138218fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN_PROF:
138318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN_PROF.S */
138418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
138518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */
138618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
138718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For monomorphic callsite, setup the Dalvik frame and return to the
138818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Thumb code through the link register to transfer control to the callee
138918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * method through a dedicated chaining cell.
139018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
139118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize
139218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ rPC = dalvikCallsite, r7 = methodToCall->registersSize
139318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ methodToCall is guaranteed to be non-native
139418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee.LinvokeChainProf:
139518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
139618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
139718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
139818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
139918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
140018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
140118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r12, lr, #2                 @ setup the punt-to-interp address
140218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
140318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r8]                    @ r8<- suspendCount (int)
140418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
140518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    r12                         @ return to raise stack overflow excep.
140618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
140718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
140818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
140918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
141018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
141118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
141218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
141318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
141418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
141518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r8, #0                      @ suspendCount != 0
141618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    r12                         @ bail to the interpreter
141718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
141818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
141918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
142018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
142118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ Update "glue" values for the new method
142218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [rGLUE, #offGlue_method]    @ glue->method = methodToCall
142318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ...
142418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r1                         @ fp = newFp
142518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r2, #offThread_curFrame]  @ self->curFrame = newFp
142618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
142718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
142818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
142918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0=methodToCall, r1=rGlue
143018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
143118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastMethodTraceEnter
143218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r2,lr}             @ restore registers
143318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
143418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
143518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr                              @ return to the callee-chaining cell
143618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
143718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
143818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
143918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
144018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
144118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF
144218fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF:
144318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF.S */
144418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
144518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */
144618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
144718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For polymorphic callsite, check whether the cached class pointer matches
144818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * the current one. If so setup the Dalvik frame and return to the
144918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Thumb code through the link register to transfer control to the callee
145018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * method through a dedicated chaining cell.
145118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
145218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * The predicted chaining cell is declared in ArmLIR.h with the
145318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * following layout:
145418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
145518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *  typedef struct PredictedChainingCell {
145618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      u4 branch;
145718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      const ClassObject *clazz;
145818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      const Method *method;
145918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      u4 counter;
146018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *  } PredictedChainingCell;
146118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
146218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Upon returning to the callsite:
146318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr  : to branch to the chaining cell
146418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr+2: to punt to the interpreter
146518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr+4: to fully resolve the callee and may rechain.
146618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *            r3 <- class
146718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *            r9 <- counter
146818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
146918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite
147018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r0, #offObject_clazz]  @ r3 <- this->class
147118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r2, #4]    @ r8 <- predictedChainCell->clazz
147218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r2, #8]    @ r0 <- predictedChainCell->method
147318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [rGLUE, #offGlue_icRechainCount]   @ r1 <- shared rechainCount
147418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r3, r8          @ predicted class == actual class?
147518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
147618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r7, .LdvmICHitCount
147718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WORKAROUND_CORTEX_A9_745320)
147818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /* Don't use conditional loads if the HW defect exists */
147918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     101f
148018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r7, #0]
148118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee101:
148218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
148318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreq   r10, [r7, #0]
148418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
148518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r10, r10, #1
148618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    streq   r10, [r7, #0]
148718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
148818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreqh  r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
148918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreqh  r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
149018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     .LinvokeChainProf   @ predicted chain is valid
149118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r7, [r3, #offClassObject_vtable] @ r7 <- this->class->vtable
149218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r8, #0          @ initialized class or not
149318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    moveq   r1, #0
149418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    subne   r1, r9, #1      @ count--
149518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    strne   r1, [rGLUE, #offGlue_icRechainCount]   @ write back to InterpState
149618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     lr, lr, #4      @ return to fully-resolve landing pad
149718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
149818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r1 <- count
149918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r2 <- &predictedChainCell
150018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r3 <- this->class
150118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r4 <- dPC
150218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r7 <- this->class->vtable
150318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
150418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr
150518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
150618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
150718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
150818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
150918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
151018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE_PROF
151118fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE_PROF:
151218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE_PROF.S */
151318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
151418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */
151518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
151618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r7 = methodToCall->registersSize
151718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
151818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
151918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
152018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
152118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
152218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
152318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r8]                    @ r3<- suspendCount (int)
152418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
152518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    lr                          @ return to raise stack overflow excep.
152618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
152718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
152818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
152918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
153018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
153118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
153218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
153318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
153418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
153518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r8, #0                      @ suspendCount != 0
153618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
153718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
153818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
153918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
154018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr                          @ bail to interpreter unconditionally
154118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
154218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
154318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ go ahead and transfer control to the native code
154418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
154518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r2, #0
154618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
154718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r2, [r3, #offThread_inJitCodeCache] @ not in the jit code cache
154818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
154918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee                                        @ newFp->localRefCookie=top
155018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r9, r3                      @ r9<- glue->self (preserve)
155118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
155218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
155318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r2, r0                      @ r2<- methodToCall
155418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, r1                      @ r0<- newFP
155518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
155618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
155718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r2=methodToCall, r6=rGLUE
155818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r2,r6}                @ to be consumed after JNI return
155918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r3}                @ preserve r0-r3
156018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, r2
156118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
156218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0=JNIMethod, r1=rGlue
156318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
156418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastMethodTraceEnter
156518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r3}                @ restore r0-r3
156618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
156718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
156818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blx     r8                          @ off to the native code
156918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
157018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
157118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r1}                @ restore r2 and r6
157218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0=JNIMethod, r1=rGlue
157318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
157418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastNativeMethodTraceExit
157518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
157618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ native return; r9=self, r10=newSaveArea
157718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ equivalent to dvmPopJniLocals
157818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
157918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
158018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r1, [r9, #offThread_exception] @ check for exception
158118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
158218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r1, #0                      @ null?
158318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
158418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
158518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
158618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = dalvikCallsitePC
158718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     .LhandleException           @ no, handle exception
158818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
158918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r2, [r9, #offThread_inJitCodeCache] @ set the mode properly
159018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r2, #0                      @ return chaining cell still exists?
159118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    r2                          @ yes - go ahead
159218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
159318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ continue executing the next instruction through the interpreter
159418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
159518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
159618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
159718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kCallsiteInterpreted
159818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
159918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r1
160018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
160118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
160218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
1603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .size   dvmCompilerTemplateStart, .-dvmCompilerTemplateStart
1604ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/footer.S */
1605ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
1606ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
1607ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *  Common subroutines and data
1608ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
1609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
1610ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .text
1612ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
1613ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LinvokeNative:
1614ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Prep for the native call
1615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall
1616ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
16177a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
1618d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
16197a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ not in jit code cache
1620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
1621d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
1622d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
1623ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r3                      @ r9<- glue->self (preserve)
162418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     lr, [rGLUE, #offGlue_pInterpBreak]
1625ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
1626ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1627ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
162818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     lr, [lr]                    @ lr<- set of active profilers
1629ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r1                      @ r0<- newFP
1630ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
163118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ands    lr, #kSubModeMethodTrace
163218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     121f                        @ hop if not profiling
16335cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    @ r2: methodToCall, r6: rGLUE
16345cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r2,r6}
16355cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}
16365cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r2
16375cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
163813fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
163913fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
16405cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}
1641ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
164213fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
164313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, [r2, #offMethod_nativeFunc]
1644ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16455cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r1}
164613fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
164713fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastNativeMethodTraceExit
164818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    b       212f
164918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee121:
165018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
165118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, [r2, #offMethod_nativeFunc]
165218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee212:
1653964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    @ Refresh Jit's on/off status
1654964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable]
1655964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
1656ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ native return; r9=self, r10=newSaveArea
1657ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ equivalent to dvmPopJniLocals
1658ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
1659d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
1660ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r1, [r9, #offThread_exception] @ check for exception
1661964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3]    @ r1 <- pointer to Jit profile table
1662ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
1663ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #0                      @ null?
1664d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
16654f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
1666964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable]  @ cache current JitProfTable
166760c24f436d603c564d5351a6f81821f12635733cBen Cheng
166860c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
166960c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
167060c24f436d603c564d5351a6f81821f12635733cBen Cheng
16717a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r9, #offThread_inJitCodeCache] @ set the new mode
167260c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
167360c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
167460c24f436d603c564d5351a6f81821f12635733cBen Cheng
167560c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
167640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
167760c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
1678978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
16797a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
16807a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
168160c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
1682ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16834f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/*
16844f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry:
16854f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0  Faulting Dalvik PC
16864f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */
1687ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LhandleException:
168811d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#if defined(WITH_SELF_VERIFICATION)
168911d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    ldr     pc, .LdeadFood @ should not see this under self-verification mode
169011d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng.LdeadFood:
169111d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    .word   0xdeadf00d
169211d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#endif
16937a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
16947a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
16957a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ in interpreter land
16964f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func
1697cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    ldr     rIBASE, .LdvmAsmInstructionStart    @ same as above
16984f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     rPC, r0                 @ reload the faulting Dalvik address
16994f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     pc, r1                  @ branch to dvmMterpCommonExceptionThrown
1700ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1701ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
1702ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmAsmInstructionStart:
1703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmAsmInstructionStart
17047a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng.LdvmJitToInterpNoChainNoProfile:
17057a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .word   dvmJitToInterpNoChainNoProfile
170640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng.LdvmJitToInterpTraceSelectNoChain:
170740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .word   dvmJitToInterpTraceSelectNoChain
1708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmJitToInterpNoChain:
1709ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmJitToInterpNoChain
1710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmMterpStdBail:
1711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmMterpStdBail
1712cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng.LdvmMterpCommonExceptionThrown:
1713cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    .word   dvmMterpCommonExceptionThrown
1714c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee.LdvmLockObject:
1715c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .word   dvmLockObject
17162e152baec01433de9c63633ebc6f4adf1cea3a87buzbee.LdvmJitTraceProfilingOff:
17172e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .word   dvmJitTraceProfilingOff
1718978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1719978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng.LdvmICHitCount:
1720978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    .word   gDvmICHitCount
1721978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#endif
17229e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
17239e45c0b968d63ea38353c99252d233879c2efdafjeffhao.LdvmSelfVerificationMemOpDecode:
17249e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .word   dvmSelfVerificationMemOpDecode
17259e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
17265cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastMethodTraceEnter:
17275cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastMethodTraceEnter
17285cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastNativeMethodTraceExit:
17295cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastNativeMethodTraceExit
17305cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastJavaMethodTraceExit:
17315cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastJavaMethodTraceExit
1732ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cdcmple:
1733ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cdcmple
1734ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cfcmple:
1735ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cfcmple
1736ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1737ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dmvCompilerTemplateEnd
1738ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdmvCompilerTemplateEnd:
1739ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1740ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /* WITH_JIT */
17417a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
1742