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
659f601a917c8878204482c37aec7005054b6776fabuzbee  r6  rSELF     thread 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
839f601a917c8878204482c37aec7005054b6776fabuzbee#define rSELF   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
1145dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .section .data.rel.ro
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
1729f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=rSELF
1738b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceExit
1748b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
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
1799a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
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
1864afb260cf1f312382541e30cab5766bff890e6feBill Buzbee    ldr     r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)]
187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng                                        @ r2<- method we're returning to
188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r2, #0                      @ break frame?
18997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq     1f                          @ bail to interpreter
19197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
19297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    blxeq   lr                          @ punt to interpreter and compare state
19397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
1947a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr     r1, .LdvmJitToInterpNoChainNoProfile @ defined in footer.S
195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r10                    @ publish new FP
1968c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
197ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1989f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
1996c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
20030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
2029f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_methodClassDex]
2039a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ check the break flags
204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movne   r9, #0                      @ clear the chaining cell address
2059f601a917c8878204482c37aec7005054b6776fabuzbee    str     r9, [rSELF, #offThread_inJitCodeCache] @ in code cache or not
206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r9, #0                      @ chaining cell exists?
207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blxne   r9                          @ jump to the chaining cell
208978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
2096c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     r0, #kCallsiteInterpreted
2106c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif
2116c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     pc, r1                      @ callsite is interpreted
212ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1:
213d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    mov     r0, #0
214d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    str     r0, [rSELF, #offThread_inJitCodeCache] @ reset inJitCodeCache
2159f601a917c8878204482c37aec7005054b6776fabuzbee    stmia   rSELF, {rPC, rFP}           @ SAVE_PC_FP_TO_SELF()
216ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, .LdvmMterpStdBail       @ defined in footer.S
2179f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ Expecting rSELF in r0
218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    blx     r2                          @ exit the interpreter
219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT
223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */
225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * runtime-resolved callee.
229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
2339f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
2349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
241a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    lr                          @ return to raise stack overflow excep.
242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
243ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
244ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
247ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ set up newSaveArea
251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
2549a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    lr                          @ bail to the interpreter
256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    tst     r10, #ACC_NATIVE
25797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     .LinvokeNative
25997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
26097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bxne    lr                          @ bail to the interpreter
26197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
26340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
265ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
2669f601a917c8878204482c37aec7005054b6776fabuzbee    @ Update "thread" values for the new method
2679f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
2689f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
269ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
27030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
27118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
2725cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}                    @ preserve r0-r3
2735cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
2749f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=methodToCall, r1=rSELF
2758b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
2768b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
2775cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}                    @ restore r0-r3
2785cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
279ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
280ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Start executing the callee
281978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
2826c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     r0, #kInlineCacheMiss
2836c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif
2848b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    bx      r10                         @ dvmJitToInterpTraceSelectNoChain
285ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
286ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
287ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
288ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN
289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN:
290ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */
291ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
292ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For monomorphic callsite, setup the Dalvik frame and return to the
293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Thumb code through the link register to transfer control to the callee
294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * method through a dedicated chaining cell.
295ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
296c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize
297c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ rPC = dalvikCallsite, r7 = methodToCall->registersSize
29838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ methodToCall is guaranteed to be non-native
29938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng.LinvokeChain:
3009f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
3019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags]        @ r8<- breakFlags
302ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
305ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r12, lr, #2                 @ setup the punt-to-interp address
307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
308ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
309a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    r12                         @ return to raise stack overflow excep.
310ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
311ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
312ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
313ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
314ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
315ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ set up newSaveArea
316ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
317ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
318ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
3199a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
320ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    r12                         @ bail to the interpreter
321ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
322ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
323ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
3249f601a917c8878204482c37aec7005054b6776fabuzbee    @ Update "thread" values for the new method
3259f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
3269f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
327ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
32830bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
32918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
3305cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
3315cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
3329f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=methodToCall, r1=rSELF
3338b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
3348b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
3355cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r2,lr}             @ restore registers
3365cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
337ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
338ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr                              @ return to the callee-chaining cell
339ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
340ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
341ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
34238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN
34338329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN:
34438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */
34538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    /*
34638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * For polymorphic callsite, check whether the cached class pointer matches
34738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * the current one. If so setup the Dalvik frame and return to the
34838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * Thumb code through the link register to transfer control to the callee
34938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * method through a dedicated chaining cell.
35038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
35189efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee     * The predicted chaining cell is declared in ArmLIR.h with the
35238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * following layout:
35338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
35438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *  typedef struct PredictedChainingCell {
35538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      u4 branch;
35638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      const ClassObject *clazz;
35738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      const Method *method;
35838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *      u4 counter;
35938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *  } PredictedChainingCell;
36038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *
36138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * Upon returning to the callsite:
36238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr  : to branch to the chaining cell
36338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr+2: to punt to the interpreter
36438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *    - lr+4: to fully resolve the callee and may rechain.
36538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *            r3 <- class
36638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     *            r9 <- counter
36738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     */
36838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite
36938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r3, [r0, #offObject_clazz]  @ r3 <- this->class
37038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r2, #4]    @ r8 <- predictedChainCell->clazz
37138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r0, [r2, #8]    @ r0 <- predictedChainCell->method
3729f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_icRechainCount] @ r1 <- shared rechainCount
37338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r3, r8          @ predicted class == actual class?
374978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
375978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    ldr     r7, .LdvmICHitCount
3768c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#if defined(WORKAROUND_CORTEX_A9_745320)
3778c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    /* Don't use conditional loads if the HW defect exists */
3788c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    bne     101f
3798c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r10, [r7, #0]
3808c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng101:
3818c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#else
382978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    ldreq   r10, [r7, #0]
3838c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#endif
384978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    add     r10, r10, #1
385978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    streq   r10, [r7, #0]
386978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#endif
387c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    ldreqh  r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
388c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    ldreqh  r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
38938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    beq     .LinvokeChain   @ predicted chain is valid
39038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r7, [r3, #offClassObject_vtable] @ r7 <- this->class->vtable
391b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    cmp     r8, #0          @ initialized class or not
392b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    moveq   r1, #0
393b88ec3cbb419b5eac23508dc6b73de2620d7521aBen Cheng    subne   r1, r9, #1      @ count--
3949f601a917c8878204482c37aec7005054b6776fabuzbee    strne   r1, [rSELF, #offThread_icRechainCount]  @ write back to thread
39538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     lr, lr, #4      @ return to fully-resolve landing pad
39638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    /*
39738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r1 <- count
39838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r2 <- &predictedChainCell
39938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r3 <- this->class
40038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r4 <- dPC
40138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     * r7 <- this->class->vtable
40238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng     */
40338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bx      lr
40438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
40538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */
40638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .balign 4
40738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE
40838329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE:
40938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */
41038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
411c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ r7 = methodToCall->registersSize
4129f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
4139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags]        @ r8<- breakFlags
41438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
41538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
41638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
41738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
41838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
419a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    lr                          @ return to raise stack overflow excep.
42038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
42138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
42238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
42338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
42438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ set up newSaveArea
42538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
42638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
42738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
4289a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
42938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
43097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
43138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bxne    lr                          @ bail to the interpreter
43297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
43397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bx      lr                          @ bail to interpreter unconditionally
43497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
43538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
43638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ go ahead and transfer control to the native code
4379f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
4387a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
43930bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
4409f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
441d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
442d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
44338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
44438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
4459f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r2, r0                        @ arg2<- methodToCall
4469f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, r1                        @ arg0<- newFP
4479f601a917c8878204482c37aec7005054b6776fabuzbee    add     r1, rSELF, #offThread_retval  @ arg1<- &retval
4489f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r3, rSELF                     @ arg3<- self
44918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
4509f601a917c8878204482c37aec7005054b6776fabuzbee    @ r2=methodToCall, r6=rSELF
4515cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r2,r6}                @ to be consumed after JNI return
4525cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}                @ preserve r0-r3
4535cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r2
4545cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
4559f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=JNIMethod, r1=rSELF
4568b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
4578b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
4585cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}                @ restore r0-r3
4595cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
46038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
46138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    blx     r8                          @ off to the native code
46238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
46318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
4645cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r1}                @ restore r2 and r6
4659f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=JNIMethod, r1=rSELF
4668b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastNativeMethodTraceExit
4678b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
4685cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
4699f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
47038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ equivalent to dvmPopJniLocals
47138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
472d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
4739f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception] @ check for exception
47430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
47538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r1, #0                      @ null?
4769f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
477909b418219f63c0d0b2bde8a0835dbf27d5061b8Bill Buzbee    ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
47860c24f436d603c564d5351a6f81821f12635733cBen Cheng
47960c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
48060c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
48160c24f436d603c564d5351a6f81821f12635733cBen Cheng
4829f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ set the mode properly
48360c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
48460c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
48560c24f436d603c564d5351a6f81821f12635733cBen Cheng
48660c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
48740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
48860c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
489978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
4907a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
4917a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
49260c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
49360c24f436d603c564d5351a6f81821f12635733cBen Cheng
49438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */
49538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    .balign 4
496ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPG_DOUBLE
497ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_DOUBLE:
498ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_DOUBLE.S */
499ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */
500ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5011465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
502ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
503ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
504ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
505ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
506ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
507ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
508ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
509ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
510ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * See OP_CMPL_FLOAT for an explanation.
511ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
512ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For: cmpl-double, cmpg-double
513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
514ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
5151465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    push    {r0-r3}                     @ save operands
5161465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
5178b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cdcmple       @ PIC way of "bl __aeabi_cdcmple"
5188b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
519ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
520ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r1<- -1
521ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r1<- 0, trumps less than
5221465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    add     sp, #16                     @ drop unused operands
5231465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
524ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
525ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
526ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
527ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
528ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_DOUBLE_gt_or_nan:
5291465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r2-r3}                     @ restore operands in reverse order
5301465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r0-r1}                     @ restore operands in reverse order
5318b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cdcmple       @ r0<- Z set if eq, C clear if <
5328b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
533ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
5341465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
535ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                            @ r1<- 1 or -1 for NaN
5361465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
537ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
538ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
539ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
540ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
541ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPL_DOUBLE
542ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_DOUBLE:
543ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */
544ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5451465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
546ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
547ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
548ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
549ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
550ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
551ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
552ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
553ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
554ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * See OP_CMPL_FLOAT for an explanation.
555ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
556ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For: cmpl-double, cmpg-double
557ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
558ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
5591465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    push    {r0-r3}                     @ save operands
5601465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
5618b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cdcmple       @ PIC way of "bl __aeabi_cdcmple"
5628b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
563ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
564ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r1<- -1
565ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r1<- 0, trumps less than
5661465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    add     sp, #16                     @ drop unused operands
5671465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
568ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
569ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
570ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
571ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
572ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_DOUBLE_gt_or_nan:
5731465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r2-r3}                     @ restore operands in reverse order
5741465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r0-r1}                     @ restore operands in reverse order
5758b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cdcmple       @ r0<- Z set if eq, C clear if <
5768b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
577ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
5781465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
579ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                            @ r1<- 1 or -1 for NaN
5801465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
581ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
582ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
583ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
584ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPG_FLOAT
585ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_FLOAT:
586ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_FLOAT.S */
587ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */
588ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
5891465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
590ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
591ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
592ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
593ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
594ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
595ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
596ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
598ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The operation we're implementing is:
599ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   if (x == y)
600ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 0;
601ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x < y)
602ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return -1;
603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x > y)
604ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 1;
605ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else
606ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return {-1,1};  // one or both operands was NaN
607ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
608ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The straightforward implementation requires 3 calls to functions
609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * that return a result in r0.  We can do it with two calls if our
610ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * EABI library supports __aeabi_cfcmple (only one if we want to check
611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for NaN directly):
612ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check x <= y
613ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return -1
614ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if ==, return 0
615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check y <= x
616ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return 1
617ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   return {-1,1}
618ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
619ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for: cmpl-float, cmpg-float
620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
621ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
622ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r0                      @ Save copies - we may need to redo
623ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r10, r1
6241465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
6258b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cfcmple       @ cmp <=: C clear if <, Z set if eq
6268b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
627ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
628ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r0<- -1
629ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r0<- 0, trumps less than
6301465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
631ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
632ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
633ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
634ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_FLOAT_gt_or_nan:
6351465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r0, r10                     @ restore in reverse order
6361465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r1, r9
6378b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cfcmple       @ r0<- Z set if eq, C clear if <
6388b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
639ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
6401465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
641ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, #1                            @ r1<- 1 or -1 for NaN
6421465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
643ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
644ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
645ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
646ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
647ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_CMPL_FLOAT
648ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_FLOAT:
649ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */
650ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
6511465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
652ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
653ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
654ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
655ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
656ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
657ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
658ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
659ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
660ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The operation we're implementing is:
661ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   if (x == y)
662ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 0;
663ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x < y)
664ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return -1;
665ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else if (x > y)
666ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return 1;
667ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   else
668ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     return {-1,1};  // one or both operands was NaN
669ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
670ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The straightforward implementation requires 3 calls to functions
671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * that return a result in r0.  We can do it with two calls if our
672ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * EABI library supports __aeabi_cfcmple (only one if we want to check
673ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for NaN directly):
674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check x <= y
675ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return -1
676ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if ==, return 0
677ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   check y <= x
678ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     if <, return 1
679ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *   return {-1,1}
680ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
681ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * for: cmpl-float, cmpg-float
682ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
683ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
684ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r0                      @ Save copies - we may need to redo
685ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r10, r1
6861465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
6878b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cfcmple       @ cmp <=: C clear if <, Z set if eq
6888b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
689ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .LTEMPLATE_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
690ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r0<- -1
691ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r0<- 0, trumps less than
6921465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
693ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
694ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
695ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
696ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_FLOAT_gt_or_nan:
6971465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r0, r10                     @ restore in reverse order
6981465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r1, r9
6998b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cfcmple       @ r0<- Z set if eq, C clear if <
7008b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
701ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
7021465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvn     r0, #0                            @ r1<- 1 or -1 for NaN
7041465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
705ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
706ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
707ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_MUL_LONG
709ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_MUL_LONG:
710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_MUL_LONG.S */
711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
712ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Signed 64-bit integer multiply.
713ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
714ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For JIT: op1 in r0/r1, op2 in r2/r3, return in r0/r1
715ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
716ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
717ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *        WX
718ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *      x YZ
719ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  --------
720ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *     ZW ZX
721ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *  YW YX
722ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * The low word of the result holds ZX, the high word holds
724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
725ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * it doesn't fit in the low 64 bits.
726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
727ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Unlike most ARM math operations, multiply instructions have
728ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * restrictions on using the same register more than once (Rd and Rm
729ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * cannot be the same).
730ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
731ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* mul-long vAA, vBB, vCC */
732ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mul     ip, r2, r1                  @  ip<- ZxW
733ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
734ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
7354afb260cf1f312382541e30cab5766bff890e6feBill Buzbee    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
7364afb260cf1f312382541e30cab5766bff890e6feBill Buzbee    mov     r0,r9
7374afb260cf1f312382541e30cab5766bff890e6feBill Buzbee    mov     r1,r10
738ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
739ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
740ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
741ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
742ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_SHL_LONG
743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHL_LONG:
744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHL_LONG.S */
745ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
746ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
747ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
748ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
749ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
750ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
751ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* shl-long vAA, vBB, vCC */
752ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r2<- r2 & 0x3f
753ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, asl r2              @  r1<- r1 << r2
754ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
755ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
756ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
757ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
758ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, asl r2              @  r0<- r0 << r2
759ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
760ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
761ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
762ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
763ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_SHR_LONG
764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHR_LONG:
765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHR_LONG.S */
766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
768ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
769ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
770ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
771ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
772ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* shr-long vAA, vBB, vCC */
773ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r0<- r0 & 0x3f
774ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
775ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
776ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
777ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
778ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
779ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, asr r2              @  r1<- r1 >> r2
780ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
781ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
782ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */
783ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .balign 4
784ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmCompiler_TEMPLATE_USHR_LONG
785ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_USHR_LONG:
786ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_USHR_LONG.S */
787ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
788ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Long integer shift.  This is different from the generic 32/64-bit
789ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * binary operations because vAA/vBB are 64-bit but vCC (the shift
790ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
791ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * 6 bits.
792ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
793ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* ushr-long vAA, vBB, vCC */
794ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    and     r2, r2, #63                 @ r0<- r0 & 0x3f
795ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
796ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    rsb     r3, r2, #32                 @  r3<- 32 - r2
797ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
798ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    ip, r2, #32                 @  ip<- r2 - 32
799ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
800ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
801ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bx      lr
802ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
8034f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* ------------------------------ */
8044f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .balign 4
8054f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .global dvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON
8064f48917c0741e4d9b15ca7c45956aea05fea103fBen ChengdvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON:
8074f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* File: armv5te/TEMPLATE_THROW_EXCEPTION_COMMON.S */
8084f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    /*
8094f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * Throw an exception from JIT'ed code.
8104f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * On entry:
8114f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     *    r0    Dalvik PC that raises the exception
8124f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     */
8134f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    b       .LhandleException
8144f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
8151465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* ------------------------------ */
8161465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    .balign 4
8179e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .global dvmCompiler_TEMPLATE_MEM_OP_DECODE
8189e45c0b968d63ea38353c99252d233879c2efdafjeffhaodvmCompiler_TEMPLATE_MEM_OP_DECODE:
8199e45c0b968d63ea38353c99252d233879c2efdafjeffhao/* File: armv5te/TEMPLATE_MEM_OP_DECODE.S */
8209e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
8211465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    /*
8229e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler encapsulates heap memory ops for selfVerification mode.
8231465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     *
8249e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * The call to the handler is inserted prior to a heap memory operation.
8259e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler then calls a function to decode the memory op, and process
8269e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * it accordingly. Afterwards, the handler changes the return address to
8279e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * skip the memory op so it never gets executed.
8281465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     */
8299e45c0b968d63ea38353c99252d233879c2efdafjeffhao    push    {r0-r12,lr}                 @ save out all registers
830d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng    ldr     r2, .LdvmSelfVerificationMemOpDecode @ defined in footer.S
8319e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r0, lr                      @ arg0 <- link register
8329e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r1, sp                      @ arg1 <- stack pointer
8339e45c0b968d63ea38353c99252d233879c2efdafjeffhao    blx     r2                          @ decode and handle the mem op
8349e45c0b968d63ea38353c99252d233879c2efdafjeffhao    pop     {r0-r12,lr}                 @ restore all registers
8359e45c0b968d63ea38353c99252d233879c2efdafjeffhao    bx      lr                          @ return to compiled code
8369e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
8371465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
838fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
839fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
840fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_COMPARETO
841fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_COMPARETO:
842fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_COMPARETO.S */
843fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
844fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's compareTo.
845fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
846fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0/r1 to have been previously checked for null.  Will
847fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return negative if this's string is < comp, 0 if they are the
848fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * same and positive if >.
849fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
850fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
851fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
852fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
853fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync with definitions in UtfString.h.  See asm-constants.h
854fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
855fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
856fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   this object pointer
857fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   comp object pointer
858fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
859fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
860fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
861fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov    r2, r0         @ this to r2, opening up r0 for return value
862fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs   r0, r2, r1     @ Same?
863fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxeq   lr
864fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
865fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r4, [r2, #STRING_FIELDOFF_OFFSET]
866fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r9, [r1, #STRING_FIELDOFF_OFFSET]
867fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r2, #STRING_FIELDOFF_COUNT]
868fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r10, [r1, #STRING_FIELDOFF_COUNT]
869fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r2, [r2, #STRING_FIELDOFF_VALUE]
870fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r1, [r1, #STRING_FIELDOFF_VALUE]
871fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
872fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
873fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
874fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    value:  r2/r1
875fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    offset: r4/r9
876fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    count:  r7/r10
877fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * We're going to compute
878fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r11 <- countDiff
879fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r10 <- minCount
880fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
881fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     subs  r11, r7, r10
882fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movls r10, r7
883fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
884fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Now, build pointers to the string data */
885fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, r2, r4, lsl #1
886fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, r1, r9, lsl #1
887fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
888fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * Note: data pointers point to previous element so we can use pre-index
889fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * mode with base writeback.
890fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
891fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, #16-2   @ offset to contents[-1]
892fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, #16-2   @ offset to contents[-1]
893fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
894fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
895fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
896fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r2: *this string data
897fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r1: *comp string data
898fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r10: iteration count for comparison
899fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r11: value to return if the first part of the string is equal
900fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r0: reserved for result
901fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r3, r4, r7, r8, r9, r12 available for loading string data
902fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
903fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
9044c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #2
9054c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blt   do_remainder2
9064c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9074c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee      /*
9084c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * Unroll the first two checks so we can quickly catch early mismatch
9094c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * on long strings (but preserve incoming alignment)
9104c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       */
9114c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9124c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r3, [r2, #2]!
9134c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r4, [r1, #2]!
9144c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r7, [r2, #2]!
9154c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r8, [r1, #2]!
9164c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r0, r3, r4
9174c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subeqs  r0, r7, r8
9184c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  lr
9194c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r10, #28
9204c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bgt   do_memcmp16
9214c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #3
922fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    blt   do_remainder
9234c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
924fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_triple:
925fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
926fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
927fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r7, [r2, #2]!
928fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r8, [r1, #2]!
929fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r9, [r2, #2]!
930fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r12,[r1, #2]!
931fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
932fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r7, r8
933fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r9, r12
934fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
935fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #3
9365965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    bge   loopback_triple
937fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
938fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeedo_remainder:
9395965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    adds  r10, #3
940fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   returnDiff
941fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
942fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_single:
943fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
944fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
945fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
946fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
947fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #1
948fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bne     loopback_single
949fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
950fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeereturnDiff:
951fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, r11
952fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
953fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
9544c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_remainder2:
9554c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    adds  r10, #2
9564c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bne   loopback_single
9574c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r11
9584c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    lr
9594c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9604c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    /* Long string case */
9614c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_memcmp16:
9624c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r4, lr
9634c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldr   lr, .Lmemcmp16
9644c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r7, r11
9654c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r0, r2, #2
9664c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r1, r1, #2
9674c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r2, r10
9684c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blx   lr
9694c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r0, #0
9704c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  r4
9714c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r7
9724c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    r4
9734c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
9744c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee.Lmemcmp16:
9754c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    .word __memcmp16
9764c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
977fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
978fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
979fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_INDEXOF
980fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_INDEXOF:
981fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_INDEXOF.S */
982fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
983fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's indexOf.
984fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
985fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0 to have been previously checked for null.  Will
986fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return index of match of r1 in r0.
987fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
988fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
989fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
990fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
991fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync wth definitions in UtfString.h  See asm-constants.h
992fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
993fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
994fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   string object pointer
995fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   char to match
996fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r2:   Starting offset in string data
997fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
998fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
999fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r0, #STRING_FIELDOFF_OFFSET]
1000fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r8, [r0, #STRING_FIELDOFF_COUNT]
10014afb260cf1f312382541e30cab5766bff890e6feBill Buzbee    ldr    r0, [r0, #STRING_FIELDOFF_VALUE]
1002fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1003fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
1004fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
10054afb260cf1f312382541e30cab5766bff890e6feBill Buzbee     *    r0: object pointer
100649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r1: char to match
100749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r2: starting offset
100849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r7: offset
100949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r8: string length
1010fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
1011fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
101249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of string data */
10134afb260cf1f312382541e30cab5766bff890e6feBill Buzbee     add   r0, #16
10144afb260cf1f312382541e30cab5766bff890e6feBill Buzbee     add   r0, r0, r7, lsl #1
101549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
101649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Save a copy of starting data in r7 */
101749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     mov   r7, r0
101849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
1019fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Clamp start to [0..count] */
1020fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, #0
1021fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movlt r2, #0
1022fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, r8
102349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     movgt r2, r8
1024fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
102549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of data to compare and pre-bias */
1026fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r0, r0, r2, lsl #1
102749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r0, #2
102849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
102949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Compute iteration count */
103049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r8, r2
1031fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1032fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
1033fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
103449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r0: start of data to test
103549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r1: chat to compare
103649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r8: iteration count
103749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r7: original start of string
103849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r3, r4, r9, r10, r11, r12 available for loading string data
1039fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
1040fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1041ab875c79c56eacc510b09710d38a9b20f7337486Bill Buzbee    subs  r8, #4
104249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    blt   indexof_remainder
1043fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
104449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop4:
1045fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1046fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r0, #2]!
104749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r10, [r0, #2]!
104849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r11, [r0, #2]!
1049fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1050fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_0
1051fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r4, r1
1052fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_1
105349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r10, r1
1054fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_2
105549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r11, r1
1056fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1057fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #4
105849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bge   indexof_loop4
1059fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
106049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_remainder:
106149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    adds    r8, #4
106249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    beq     indexof_nomatch
1063fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
106449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop1:
1065fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1066fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1067fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1068fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #1
106949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bne   indexof_loop1
1070fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
107149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_nomatch:
1072fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, #-1
1073fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1074fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1075fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_0:
1076fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #6
107749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
107849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1079fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1080fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_1:
1081fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #4
108249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
108349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1084fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1085fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_2:
1086fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #2
108749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
108849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1089fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1090fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_3:
109149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
109249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1093fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1094fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
10959a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* ------------------------------ */
10969a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .balign 4
10979a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .global dvmCompiler_TEMPLATE_INTERPRET
10989a8c75adb2abf551d06dbf757bff558c1feded08Bill BuzbeedvmCompiler_TEMPLATE_INTERPRET:
10999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* File: armv5te/TEMPLATE_INTERPRET.S */
11009a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
11019a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * This handler transfers control to the interpeter without performing
11029a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * any lookups.  It may be called either as part of a normal chaining
11039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * operation, or from the transition code in header.S.  We distinquish
11049a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * the two cases by looking at the link register.  If called from a
1105bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee     * translation chain, it will point to the chaining Dalvik PC -3.
11069a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * On entry:
11079a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    lr - if NULL:
11089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *        r1 - the Dalvik PC to begin interpretation.
11099a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    else
1110bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee     *        [lr, #3] contains Dalvik PC to begin interpretation
11119f601a917c8878204482c37aec7005054b6776fabuzbee     *    rSELF - pointer to thread
11129a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    rFP - Dalvik frame pointer
11139a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
11149a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    cmp     lr, #0
11158c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#if defined(WORKAROUND_CORTEX_A9_745320)
11168c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    /* Don't use conditional loads if the HW defect exists */
11178c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    beq     101f
11188c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r1,[lr, #3]
11198c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng101:
11208c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#else
1121bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee    ldrne   r1,[lr, #3]
11228c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#endif
11239a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr     r2, .LinterpPunt
11249a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r0, r1                       @ set Dalvik PC
11259a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bx      r2
11269a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    @ doesn't return
11279a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
11289a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee.LinterpPunt:
11299a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .word   dvmJitToInterpPunt
11309a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
1131c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1132c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1133c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER
1134c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER:
1135c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER.S */
1136c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1137c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Call out to the runtime to lock an object.  Because this thread
1138c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * may have been suspended in THREAD_MONITOR state and the Jit's
1139c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * translation cache subsequently cleared, we cannot return directly.
1140c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Instead, unconditionally transition to the interpreter to resume.
1141c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1142c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1143c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1144c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1145c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
114679842ac67e2a23cb544bfe1ee3961d325a2552e7Bill Buzbee     */
1147c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1148c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1149c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1150c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2                           @ dvmLockObject(self, obj)
1151c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmJitToInterpNoChain
1152c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1153978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1154eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1155eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1156c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1157c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
1158c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1159c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1160c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG
1161c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
1162c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER_DEBUG.S */
1163c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1164c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * To support deadlock prediction, this version of MONITOR_ENTER
1165c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * will always call the heavyweight dvmLockObject, check for an
1166c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * exception and then bail out to the interpreter.
1167c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1168c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1169c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1170c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1171c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
1172c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1173c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     */
1174c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1175c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1176c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1177c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2             @ dvmLockObject(self, obj)
117899e3e6e72e3471eb85fc2e405866392b01c080febuzbee    @ test for exception
11799f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception]
1180c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    cmp     r1, #0
1181c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    beq     1f
1182c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LhandleException
1183c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    sub     r0, r4, #2     @ roll dPC back to this monitor instruction
1184c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1185c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee1:
1186c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1187978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1188eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1189eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1190c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     pc, .LdvmJitToInterpNoChain
1191c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
11922e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* ------------------------------ */
11932e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .balign 4
11942e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .global dvmCompiler_TEMPLATE_PERIODIC_PROFILING
11952e152baec01433de9c63633ebc6f4adf1cea3a87buzbeedvmCompiler_TEMPLATE_PERIODIC_PROFILING:
11962e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* File: armv5te/TEMPLATE_PERIODIC_PROFILING.S */
11972e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    /*
11982e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * Increment profile counter for this trace, and decrement
11992e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * sample counter.  If sample counter goes below zero, turn
12002e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * off profiling.
12012e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *
12022e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * On entry
12032e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * (lr-11) is address of pointer to counter.  Note: the counter
12042e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *    actually exists 10 bytes before the return target, but because
12052e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *    we are arriving from thumb mode, lr will have its low bit set.
12062e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     */
12072e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r0, [lr,#-11]
12089f601a917c8878204482c37aec7005054b6776fabuzbee     ldr    r1, [rSELF, #offThread_pProfileCountdown]
12092e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r2, [r0]                    @ get counter
12102e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r3, [r1]                    @ get countdown timer
12112e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     add    r2, #1
12122e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     subs   r2, #1
12132e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     blt    .LTEMPLATE_PERIODIC_PROFILING_disable_profiling
12142e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     str    r2, [r0]
12152e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     str    r3, [r1]
12162e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     bx     lr
12172e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
12182e152baec01433de9c63633ebc6f4adf1cea3a87buzbee.LTEMPLATE_PERIODIC_PROFILING_disable_profiling:
12192e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     mov    r4, lr                     @ preserve lr
12202e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r0, .LdvmJitTraceProfilingOff
12212e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     blx    r0
12222e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     bx     r4
12232e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
122418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
122518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
122618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_RETURN_PROF
122718fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_RETURN_PROF:
122818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_RETURN_PROF.S */
122918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
123018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_RETURN.S */
123118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
123218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX.
123318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * If the stored value in returnAddr
123418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * is non-zero, the caller is compiled by the JIT thus return to the
123518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * address in the code cache following the invoke instruction. Otherwise
123618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * return to the special dvmJitToInterpNoChain entry point.
123718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
123818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
123918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r2,lr}             @ preserve live registers
124018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, r6
12419f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=rSELF
12428b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceExit
12438b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
124418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r2,lr}             @ restore live registers
124518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
124618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
124718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r0, #offStackSaveArea_prevFrame] @ r10<- saveArea->prevFrame
12489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
124918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     rPC, [r0, #offStackSaveArea_savedPc] @ rPC<- saveArea->savedPc
125018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
125118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9,  [r0, #offStackSaveArea_returnAddr] @ r9<- chaining cell ret
125218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
125318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r9, #0                      @ disable chaining
125418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
12554afb260cf1f312382541e30cab5766bff890e6feBill Buzbee    ldr     r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)]
125618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee                                        @ r2<- method we're returning to
125718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r2, #0                      @ break frame?
125818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
125918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     1f                          @ bail to interpreter
126018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
126118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blxeq   lr                          @ punt to interpreter and compare state
126218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
126318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r1, .LdvmJitToInterpNoChainNoProfile @ defined in footer.S
126418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r10                    @ publish new FP
126518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
126618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
12679f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
126818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
126930bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
127018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
12719f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_methodClassDex]
12729a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ check the break flags
127318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    movne   r9, #0                      @ clear the chaining cell address
12749f601a917c8878204482c37aec7005054b6776fabuzbee    str     r9, [rSELF, #offThread_inJitCodeCache] @ in code cache or not
127518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r9, #0                      @ chaining cell exists?
127618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blxne   r9                          @ jump to the chaining cell
127718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
127818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kCallsiteInterpreted
127918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
128018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r1                      @ callsite is interpreted
128118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee1:
1282d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    mov     r0, #0
1283d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    str     r0, [rSELF, #offThread_inJitCodeCache] @ reset inJitCodeCache
12849f601a917c8878204482c37aec7005054b6776fabuzbee    stmia   rSELF, {rPC, rFP}           @ SAVE_PC_FP_TO_SELF()
128518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, .LdvmMterpStdBail       @ defined in footer.S
12869f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ Expecting rSELF in r0
128718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blx     r2                          @ exit the interpreter
128818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
128918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
129018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
129118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
129218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
129318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT_PROF
129418fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT_PROF:
129518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT_PROF.S */
129618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
129718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */
129818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
129918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
130018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
130118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * runtime-resolved callee.
130218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
130318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
130418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
130518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
13069f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
13079a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
130818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
130918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
131018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
131118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
131218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
131318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
131418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    lr                          @ return to raise stack overflow excep.
131518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
131618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
131718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
131818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
131918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
132018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
132118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
132218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
132318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
132418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
132518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
132618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
13279a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
132818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
132918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    tst     r10, #ACC_NATIVE
133018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
133118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     .LinvokeNative
133218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
133318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
133418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
133518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
133618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
133718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
133818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
13399f601a917c8878204482c37aec7005054b6776fabuzbee    @ Update "thread" values for the new method
13409f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
13419f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
134218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r1                         @ fp = newFp
134330bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
134418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
134518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r3}                    @ preserve r0-r3
134618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
13479f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=methodToCall, r1=rSELF
13488b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
13498b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
135018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r3}                    @ restore r0-r3
135118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
135218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
135318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ Start executing the callee
135418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
135518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kInlineCacheMiss
135618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
13578b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    bx      r10                         @ dvmJitToInterpTraceSelectNoChain
135818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
135918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
136018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
136118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
136218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
136318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN_PROF
136418fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN_PROF:
136518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN_PROF.S */
136618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
136718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */
136818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
136918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For monomorphic callsite, setup the Dalvik frame and return to the
137018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Thumb code through the link register to transfer control to the callee
137118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * method through a dedicated chaining cell.
137218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
137318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize
137418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ rPC = dalvikCallsite, r7 = methodToCall->registersSize
137518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ methodToCall is guaranteed to be non-native
137618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee.LinvokeChainProf:
13779f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
13789a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags]        @ r8<- breakFlags
137918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
138018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
138118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
138218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
138318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r12, lr, #2                 @ setup the punt-to-interp address
138418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
138518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
138618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    r12                         @ return to raise stack overflow excep.
138718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
138818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
138918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
139018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
139118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
139218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
139318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
139418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
139518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
13969a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
139718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    r12                         @ bail to the interpreter
139818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
139918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
140018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
14019f601a917c8878204482c37aec7005054b6776fabuzbee    @ Update "thread" values for the new method
14029f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
14039f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
140418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r1                         @ fp = newFp
140530bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
140618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
140718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
140818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
14099f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=methodToCall, r1=rSELF
14108b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
14118b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
141218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r2,lr}             @ restore registers
141318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
141418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
141518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr                              @ return to the callee-chaining cell
141618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
141718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
141818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
141918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
142018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
142118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF
142218fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF:
142318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF.S */
142418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
142518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */
142618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
142718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For polymorphic callsite, check whether the cached class pointer matches
142818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * the current one. If so setup the Dalvik frame and return to the
142918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Thumb code through the link register to transfer control to the callee
143018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * method through a dedicated chaining cell.
143118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
143218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * The predicted chaining cell is declared in ArmLIR.h with the
143318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * following layout:
143418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
143518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *  typedef struct PredictedChainingCell {
143618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      u4 branch;
143718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      const ClassObject *clazz;
143818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      const Method *method;
143918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      u4 counter;
144018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *  } PredictedChainingCell;
144118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
144218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Upon returning to the callsite:
144318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr  : to branch to the chaining cell
144418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr+2: to punt to the interpreter
144518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr+4: to fully resolve the callee and may rechain.
144618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *            r3 <- class
144718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *            r9 <- counter
144818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
144918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite
145018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r0, #offObject_clazz]  @ r3 <- this->class
145118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r2, #4]    @ r8 <- predictedChainCell->clazz
145218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r2, #8]    @ r0 <- predictedChainCell->method
14539f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_icRechainCount] @ r1 <- shared rechainCount
145418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r3, r8          @ predicted class == actual class?
145518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
145618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r7, .LdvmICHitCount
145718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WORKAROUND_CORTEX_A9_745320)
145818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /* Don't use conditional loads if the HW defect exists */
145918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     101f
146018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r7, #0]
146118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee101:
146218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
146318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreq   r10, [r7, #0]
146418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
146518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r10, r10, #1
146618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    streq   r10, [r7, #0]
146718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
146818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreqh  r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
146918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreqh  r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
147018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     .LinvokeChainProf   @ predicted chain is valid
147118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r7, [r3, #offClassObject_vtable] @ r7 <- this->class->vtable
147218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r8, #0          @ initialized class or not
147318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    moveq   r1, #0
147418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    subne   r1, r9, #1      @ count--
14759f601a917c8878204482c37aec7005054b6776fabuzbee    strne   r1, [rSELF, #offThread_icRechainCount]  @ write back to thread
147618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     lr, lr, #4      @ return to fully-resolve landing pad
147718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
147818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r1 <- count
147918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r2 <- &predictedChainCell
148018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r3 <- this->class
148118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r4 <- dPC
148218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r7 <- this->class->vtable
148318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
148418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr
148518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
148618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
148718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
148818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
148918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
149018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE_PROF
149118fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE_PROF:
149218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE_PROF.S */
149318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
149418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */
149518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
149618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r7 = methodToCall->registersSize
14979f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
14989a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags]        @ r8<- breakFlags
149918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
150018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
150118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
150218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
150318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
150418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    lr                          @ return to raise stack overflow excep.
150518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
150618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
150718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
150818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
150918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
151018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
151118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
151218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
15139a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
151418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
151518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
151618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
151718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
151818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr                          @ bail to interpreter unconditionally
151918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
152018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
152118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ go ahead and transfer control to the native code
15229f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
152318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r2, #0
152430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
15259f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
152618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
152718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee                                        @ newFp->localRefCookie=top
152818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
152918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
15309f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r2, r0                        @ arg2<- methodToCall
15319f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, r1                        @ arg0<- newFP
15329f601a917c8878204482c37aec7005054b6776fabuzbee    add     r1, rSELF, #offThread_retval  @ arg1<- &retval
15339f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r3, rSELF                     @ arg3<- self
153418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
15359f601a917c8878204482c37aec7005054b6776fabuzbee    @ r2=methodToCall, r6=rSELF
153618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r2,r6}                @ to be consumed after JNI return
153718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r3}                @ preserve r0-r3
153818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, r2
153918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
15409f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=JNIMethod, r1=rSELF
15418b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
15428b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
154318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r3}                @ restore r0-r3
154418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
154518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
154618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blx     r8                          @ off to the native code
154718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
154818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
154918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r1}                @ restore r2 and r6
15509f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=JNIMethod, r1=rSELF
15518b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastNativeMethodTraceExit
15528b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
155318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
15549f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
155518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ equivalent to dvmPopJniLocals
155618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
155718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
15589f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception] @ check for exception
155930bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
156018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r1, #0                      @ null?
15619f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
156218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
156318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
156418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = dalvikCallsitePC
156518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     .LhandleException           @ no, handle exception
156618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
15679f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ set the mode properly
156818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r2, #0                      @ return chaining cell still exists?
156918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    r2                          @ yes - go ahead
157018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
157118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ continue executing the next instruction through the interpreter
157218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
157318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
157418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
157518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kCallsiteInterpreted
157618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
157718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r1
157818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
157918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
158018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
1581ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .size   dvmCompilerTemplateStart, .-dvmCompilerTemplateStart
1582ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/footer.S */
1583ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
1584ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
1585ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *  Common subroutines and data
1586ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
1587ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
1588ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
15895dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .section .data.rel.ro
1590ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
1591ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LinvokeNative:
1592ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Prep for the native call
1593ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall
15947a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
15959f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
15969f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
159730bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
1598d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
1599d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
1600389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    lr, [rSELF, #offThread_subMode]
1601ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
1602ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
1604ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r1                      @ r0<- newFP
16059f601a917c8878204482c37aec7005054b6776fabuzbee    add     r1, rSELF, #offThread_retval  @ r1<- &retval
16069f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r3, rSELF                   @ arg3<- self
160718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ands    lr, #kSubModeMethodTrace
160818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     121f                        @ hop if not profiling
16099f601a917c8878204482c37aec7005054b6776fabuzbee    @ r2: methodToCall, r6: rSELF
16105cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r2,r6}
16115cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}
16125cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r2
16135cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
16148b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastMethodTraceEnter
16158b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
16165cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}
1617ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16188b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, [r2, #offMethod_nativeFunc]
16198b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
1620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16215cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r1}
16228b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .LdvmFastNativeMethodTraceExit
16238b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
162418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    b       212f
162518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee121:
16268b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, [r2, #offMethod_nativeFunc]
16278b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
162818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee212:
1629964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
16309f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
1631ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ equivalent to dvmPopJniLocals
1632ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
1633d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
16349f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception] @ check for exception
163530bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
1636ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #0                      @ null?
16379f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
16384f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
163960c24f436d603c564d5351a6f81821f12635733cBen Cheng
164060c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
164160c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
164260c24f436d603c564d5351a6f81821f12635733cBen Cheng
16439f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ set the new mode
164460c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
164560c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
164660c24f436d603c564d5351a6f81821f12635733cBen Cheng
164760c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
164840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
164960c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
1650978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
16517a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
16527a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
16538b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    bx      r1
1654ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16554f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/*
16564f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry:
16574f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0  Faulting Dalvik PC
16584f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */
1659ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LhandleException:
166011d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#if defined(WITH_SELF_VERIFICATION)
166111d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    ldr     pc, .LdeadFood @ should not see this under self-verification mode
166211d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng.LdeadFood:
166311d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    .word   0xdeadf00d
166411d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#endif
16657a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
16669f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ in interpreter land
16674f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func
1668cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    ldr     rIBASE, .LdvmAsmInstructionStart    @ same as above
16694f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     rPC, r0                 @ reload the faulting Dalvik address
16708b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    bx      r1                  @ branch to dvmMterpCommonExceptionThrown
1671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1672ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
1673ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmAsmInstructionStart:
1674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmAsmInstructionStart
16757a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng.LdvmJitToInterpNoChainNoProfile:
16767a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .word   dvmJitToInterpNoChainNoProfile
167740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng.LdvmJitToInterpTraceSelectNoChain:
167840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .word   dvmJitToInterpTraceSelectNoChain
1679ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmJitToInterpNoChain:
1680ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmJitToInterpNoChain
1681ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmMterpStdBail:
1682ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmMterpStdBail
1683cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng.LdvmMterpCommonExceptionThrown:
1684cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    .word   dvmMterpCommonExceptionThrown
1685c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee.LdvmLockObject:
1686c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .word   dvmLockObject
16872e152baec01433de9c63633ebc6f4adf1cea3a87buzbee.LdvmJitTraceProfilingOff:
16882e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .word   dvmJitTraceProfilingOff
1689978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1690978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng.LdvmICHitCount:
1691978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    .word   gDvmICHitCount
1692978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#endif
16939e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
16949e45c0b968d63ea38353c99252d233879c2efdafjeffhao.LdvmSelfVerificationMemOpDecode:
16959e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .word   dvmSelfVerificationMemOpDecode
16969e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
16975cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastMethodTraceEnter:
16985cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastMethodTraceEnter
16995cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastNativeMethodTraceExit:
17005cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastNativeMethodTraceExit
17019a3147c7412f4794434b4c2604aa2ba784867774buzbee.LdvmFastMethodTraceExit:
17029a3147c7412f4794434b4c2604aa2ba784867774buzbee    .word   dvmFastMethodTraceExit
1703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cdcmple:
1704ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cdcmple
1705ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cfcmple:
1706ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cfcmple
1707ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dmvCompilerTemplateEnd
1709ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdmvCompilerTemplateEnd:
1710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /* WITH_JIT */
17127a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
1713