150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * This file was generated automatically by gen-template.py for 'armv5te-vfp'.
350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee *
450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * --> DO NOT EDIT <--
550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/header.S */
850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Copyright (C) 2008 The Android Open Source Project
1050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee *
1150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Licensed under the Apache License, Version 2.0 (the "License");
1250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * you may not use this file except in compliance with the License.
1350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * You may obtain a copy of the License at
1450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee *
1550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee *      http://www.apache.org/licenses/LICENSE-2.0
1650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee *
1750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Unless required by applicable law or agreed to in writing, software
1850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * distributed under the License is distributed on an "AS IS" BASIS,
1950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * See the License for the specific language governing permissions and
2150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * limitations under the License.
2250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
2350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
2450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#if defined(WITH_JIT)
2550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
2650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
2750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * ARMv5 definitions and declarations.
2850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
2950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
3050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
3150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeARM EABI general notes:
3250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
3350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer0-r3 hold first 4 args to a method; they are not preserved across method calls
3450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer4-r8 are available for general use
3550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer9 is given special treatment in some situations, but not for us
3650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer10 (sl) seems to be generally available
3750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
3850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer12 (ip) is scratch -- not preserved across method calls
3950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer13 (sp) should be managed carefully in case a signal arrives
4050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer14 (lr) must be preserved
4150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer15 (pc) can be tinkered with directly
4250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
4350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer0 holds returns of <= 4 bytes
4450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeer0-r1 hold returns of 8 bytes, low word in r0
4550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
4650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeCallee must save/restore r4+ (except r12) if it modifies them.
4750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
4850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeStack is "full descending".  Only the arguments that don't fit in the first 4
4950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeeregisters are placed on the stack.  "sp" points at the first stacked argument
5050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee(i.e. the 5th arg).
5150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
5250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeVFP: single-precision results in s0, double-precision results in d0.
5350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
5450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeIn the EABI, "sp" must be 64-bit aligned on entry to a function, and any
5550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee64-bit quantities (long long, double) must be 64-bit aligned.
5650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee*/
5750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
5850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
5950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeJIT and ARM notes:
6050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
6150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeThe following registers have fixed assignments:
6250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
6350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee  reg nick      purpose
6450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee  r5  rFP       interpreted frame pointer, used for accessing locals and args
659f601a917c8878204482c37aec7005054b6776fabuzbee  r6  rSELF     thread pointer
6650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
6750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeThe following registers have fixed assignments in mterp but are scratch
6850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeeregisters in compiled code
6950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
7050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee  reg nick      purpose
7150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee  r4  rPC       interpreted program counter, used for fetching instructions
7250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee  r7  rINST     first 16-bit code unit of current instruction
7350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee  r8  rIBASE    interpreted instruction base pointer, used for computed goto
7450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
7550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeeMacros are provided for common operations.  Each macro MUST emit only
7650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeeone instruction to make instruction-counting easier.  They MUST NOT alter
7750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbeeunspecified registers or condition codes.
7850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee*/
7950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
8050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* single-purpose registers, given names for clarity */
8150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define rPC     r4
8250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define rFP     r5
839f601a917c8878204482c37aec7005054b6776fabuzbee#define rSELF   r6
8450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define rINST   r7
8550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define rIBASE  r8
8650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
8750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
8850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Given a frame pointer, find the stack save area.
8950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee *
9050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * In C this is "((StackSaveArea*)(_fp) -1)".
9150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
9250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define SAVEAREA_FROM_FP(_reg, _fpreg) \
9350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    sub     _reg, _fpreg, #sizeofStackSaveArea
9450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
959a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee#define EXPORT_PC() \
969a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
979a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
9850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
9950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * This is a #include, not a %include, because we want the C pre-processor
10050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * to expand the macros into assembler assignment statements.
10150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
10250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#include "../../../mterp/common/asm-constants.h"
10350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
104342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee/* File: armv5te-vfp/platform.S */
10550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
10650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * ===========================================================================
107342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee *  CPU-version-specific defines and utility
10850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * ===========================================================================
10950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
11050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
11150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
11250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompilerTemplateStart
11350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .type   dvmCompilerTemplateStart, %function
11450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .text
11550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
11650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompilerTemplateStart:
11750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
11850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
11950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
12050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_CMP_LONG
12150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_CMP_LONG:
12250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_CMP_LONG.S */
12350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
12450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
12550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * register based on the results of the comparison.
12650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
12750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * We load the full values with LDM, but in practice many values could
12850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * be resolved by only looking at the high word.  This could be made
12950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * faster or slower by splitting the LDM into a pair of LDRs.
13050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
13150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * If we just wanted to set condition flags, we could do this:
13250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *  subs    ip, r0, r2
13350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *  sbcs    ip, r1, r3
13450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *  subeqs  ip, r0, r2
13550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
13650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * integer value, which we can do with 2 conditional mov/mvn instructions
13750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * (set 1, set -1; if they're equal we already have 0 in ip), giving
13850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * us a constant 5-cycle path plus a branch at the end to the
13950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * instruction epilogue code.  The multi-compare approach below needs
14050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
14150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * in the worst case (the 64-bit values are equal).
14250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
14350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* cmp-long vAA, vBB, vCC */
14450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
14550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    blt     .LTEMPLATE_CMP_LONG_less            @ signed compare on high part
14650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bgt     .LTEMPLATE_CMP_LONG_greater
14750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    subs    r0, r0, r2                  @ r0<- r0 - r2
14850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bxeq     lr
14950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bhi     .LTEMPLATE_CMP_LONG_greater         @ unsigned compare on low part
15050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LTEMPLATE_CMP_LONG_less:
15150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mvn     r0, #0                      @ r0<- -1
15250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
15350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LTEMPLATE_CMP_LONG_greater:
15450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0, #1                      @ r0<- 1
15550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
15650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
15750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
15850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
15950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_RETURN
16050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_RETURN:
16150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_RETURN.S */
16250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
16350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX.
16450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * If the stored value in returnAddr
16550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * is non-zero, the caller is compiled by the JIT thus return to the
16650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * address in the code cache following the invoke instruction. Otherwise
16750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * return to the special dvmJitToInterpNoChain entry point.
16850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
16918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
1705cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r2,lr}             @ preserve live registers
1715cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r6
1729f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=rSELF
17313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
1749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     pc, .LdvmFastMethodTraceExit
1755cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r2,lr}             @ restore live registers
1765cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
17750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
17850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r10, [r0, #offStackSaveArea_prevFrame] @ r10<- saveArea->prevFrame
1799a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
18050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     rPC, [r0, #offStackSaveArea_savedPc] @ rPC<- saveArea->savedPc
18197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
18250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r9,  [r0, #offStackSaveArea_returnAddr] @ r9<- chaining cell ret
18397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
18497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r9, #0                      @ disable chaining
18597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
18650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)]
18750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee                                        @ r2<- method we're returning to
18850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    cmp     r2, #0                      @ break frame?
18997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
19050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
19550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     rFP, r10                    @ publish new FP
1968c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
19750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
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
20150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
2029f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_methodClassDex]
2039a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ check the break flags
20450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    movne   r9, #0                      @ clear the chaining cell address
2059f601a917c8878204482c37aec7005054b6776fabuzbee    str     r9, [rSELF, #offThread_inJitCodeCache] @ in code cache or not
20650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    cmp     r9, #0                      @ chaining cell exists?
20750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
21250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee1:
213d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    mov     r0, #0
214d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    str     r0, [rSELF, #offThread_inJitCodeCache] @ reset inJitCodeCache
2159f601a917c8878204482c37aec7005054b6776fabuzbee    stmia   rSELF, {rPC, rFP}           @ SAVE_PC_FP_TO_SELF()
21650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r2, .LdvmMterpStdBail       @ defined in footer.S
2179f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ Expecting rSELF in r0
21850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    blx     r2                          @ exit the interpreter
21950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
22050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
22150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
22250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT
22350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
22450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */
22550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
22650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
22750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
22850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * runtime-resolved callee.
22950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
23050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
23150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
23250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
2339f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
2349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
23550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    add     r3, r1, #1  @ Thumb addr is odd
23650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
23750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
23850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
23950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
24050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
241a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    lr                          @ return to raise stack overflow excep.
24250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
24350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
24450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
24550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
24650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
24750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
24850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
24950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
25050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ set up newSaveArea
25150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
25250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
25350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
2549a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
25550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bxne    lr                          @ bail to the interpreter
25650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    tst     r10, #ACC_NATIVE
25797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
25850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bne     .LinvokeNative
25997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
26097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bxne    lr                          @ bail to the interpreter
26197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
26250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
26340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
26450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
26550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
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 = ...
26950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
27513fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
27613fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
2775cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}                    @ restore r0-r3
2785cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
27950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
28050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ Start executing the callee
281978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
2826c10a977ec892c26c8e306356491833bbb073d40Ben Cheng    mov     r0, #kInlineCacheMiss
2836c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif
28440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
28550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
28650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
28750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
28850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN
28950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN:
29050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */
29150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
29250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For monomorphic callsite, setup the Dalvik frame and return to the
29350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Thumb code through the link register to transfer control to the callee
29450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * method through a dedicated chaining cell.
29550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
296c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize
297c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng    @ rPC = dalvikCallsite, r7 = methodToCall->registersSize
29850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ methodToCall is guaranteed to be non-native
29950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LinvokeChain:
3009f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
3019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags]        @ r8<- breakFlags
30250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    add     r3, r1, #1  @ Thumb addr is odd
30350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
30450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
30550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
30650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    add     r12, lr, #2                 @ setup the punt-to-interp address
30750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
30850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
309a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    r12                         @ return to raise stack overflow excep.
31050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
31150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
31250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
31350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
31450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
31550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ set up newSaveArea
31650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
31750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
31850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
3199a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
32050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bxne    r12                         @ bail to the interpreter
32150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
32250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
32350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
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 = ...
32750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
33313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
33413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
3355cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r2,lr}             @ restore registers
3365cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
33750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
33850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr                              @ return to the callee-chaining cell
33950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
34050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
34150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
34250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN
34350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN:
34450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */
34550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
34650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For polymorphic callsite, check whether the cached class pointer matches
34750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * the current one. If so setup the Dalvik frame and return to the
34850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Thumb code through the link register to transfer control to the callee
34950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * method through a dedicated chaining cell.
35050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
35189efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee     * The predicted chaining cell is declared in ArmLIR.h with the
35250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * following layout:
35350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
35450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *  typedef struct PredictedChainingCell {
35550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *      u4 branch;
35650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *      const ClassObject *clazz;
35750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *      const Method *method;
35850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *      u4 counter;
35950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *  } PredictedChainingCell;
36050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
36150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Upon returning to the callsite:
36250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    - lr  : to branch to the chaining cell
36350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    - lr+2: to punt to the interpreter
36450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    - lr+4: to fully resolve the callee and may rechain.
36550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *            r3 <- class
36650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *            r9 <- counter
36750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
36850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite
36950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r3, [r0, #offObject_clazz]  @ r3 <- this->class
37050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r8, [r2, #4]    @ r8 <- predictedChainCell->clazz
37150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r0, [r2, #8]    @ r0 <- predictedChainCell->method
3729f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_icRechainCount] @ r1 <- shared rechainCount
37350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
38950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    beq     .LinvokeChain   @ predicted chain is valid
39050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
39550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    add     lr, lr, #4      @ return to fully-resolve landing pad
39650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
39750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * r1 <- count
39850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * r2 <- &predictedChainCell
39950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * r3 <- this->class
40050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * r4 <- dPC
40150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * r7 <- this->class->vtable
40250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
40350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
40450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
40550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
40650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
40750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE
40850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE:
40950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */
41050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ 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
41450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    add     r3, r1, #1  @ Thumb addr is odd
41550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
41650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
41750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
41850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
419a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng    bxlo    lr                          @ return to raise stack overflow excep.
42050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
42150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
42250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
42350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
42450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ set up newSaveArea
42550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
42650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
42750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
4289a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
42950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
43097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
43150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bxne    lr                          @ bail to the interpreter
43297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
43397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bx      lr                          @ bail to interpreter unconditionally
43497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
43550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
43650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ 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
44350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
44450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
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
45613fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
45713fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
4585cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}                @ restore r0-r3
4595cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
46050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
46150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    blx     r8                          @ off to the native code
46250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
46318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
4645cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r1}                @ restore r2 and r6
4659f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=JNIMethod, r1=rSELF
46613fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
46713fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastNativeMethodTraceExit
4685cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif
4699f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
47050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ equivalent to dvmPopJniLocals
47150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
47550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    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
49450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
49550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
49650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_MUL_LONG
49750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_MUL_LONG:
49850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_MUL_LONG.S */
49950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
50050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Signed 64-bit integer multiply.
50150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
50250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For JIT: op1 in r0/r1, op2 in r2/r3, return in r0/r1
50350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
50450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
50550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *        WX
50650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *      x YZ
50750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *  --------
50850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     ZW ZX
50950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *  YW YX
51050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
51150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * The low word of the result holds ZX, the high word holds
51250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
51350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * it doesn't fit in the low 64 bits.
51450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
51550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Unlike most ARM math operations, multiply instructions have
51650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * restrictions on using the same register more than once (Rd and Rm
51750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * cannot be the same).
51850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
51950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* mul-long vAA, vBB, vCC */
52050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mul     ip, r2, r1                  @  ip<- ZxW
52150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
52250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
52350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
52450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0,r9
52550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r1,r10
52650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
52750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
52850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
52950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
53050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_SHL_LONG
53150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_SHL_LONG:
53250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_SHL_LONG.S */
53350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
53450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Long integer shift.  This is different from the generic 32/64-bit
53550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
53650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
53750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * 6 bits.
53850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
53950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* shl-long vAA, vBB, vCC */
54050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    and     r2, r2, #63                 @ r2<- r2 & 0x3f
54150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r1, r1, asl r2              @  r1<- r1 << r2
54250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    rsb     r3, r2, #32                 @  r3<- 32 - r2
54350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
54450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    subs    ip, r2, #32                 @  ip<- r2 - 32
54550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
54650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0, r0, asl r2              @  r0<- r0 << r2
54750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
54850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
54950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
55050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
55150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_SHR_LONG
55250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_SHR_LONG:
55350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_SHR_LONG.S */
55450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
55550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Long integer shift.  This is different from the generic 32/64-bit
55650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
55750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
55850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * 6 bits.
55950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
56050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* shr-long vAA, vBB, vCC */
56150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    and     r2, r2, #63                 @ r0<- r0 & 0x3f
56250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
56350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    rsb     r3, r2, #32                 @  r3<- 32 - r2
56450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
56550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    subs    ip, r2, #32                 @  ip<- r2 - 32
56650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
56750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r1, r1, asr r2              @  r1<- r1 >> r2
56850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
56950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
57050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
57150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
57250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_USHR_LONG
57350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_USHR_LONG:
57450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/TEMPLATE_USHR_LONG.S */
57550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
57650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Long integer shift.  This is different from the generic 32/64-bit
57750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
57850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
57950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * 6 bits.
58050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
58150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* ushr-long vAA, vBB, vCC */
58250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    and     r2, r2, #63                 @ r0<- r0 & 0x3f
58350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
58450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    rsb     r3, r2, #32                 @  r3<- 32 - r2
58550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
58650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    subs    ip, r2, #32                 @  ip<- r2 - 32
58750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
58850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
58950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
59050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
59150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
59250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
59350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_ADD_FLOAT_VFP
59450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_ADD_FLOAT_VFP:
59550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_ADD_FLOAT_VFP.S */
59650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinop.S */
59750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
59850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32-bit floating point operation.  Provide an "instr" line that
59950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
60050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
60150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
60250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
60350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
60450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
60550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
60650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s0,[r1]
60750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s1,[r2]
60850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fadds   s2, s0, s1
60950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fsts    s2,[r0]
61050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
61150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
61250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
61350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
61450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
61550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_SUB_FLOAT_VFP
61650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_SUB_FLOAT_VFP:
61750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_SUB_FLOAT_VFP.S */
61850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinop.S */
61950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
62050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32-bit floating point operation.  Provide an "instr" line that
62150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
62250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
62350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
62450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
62550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
62650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
62750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
62850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s0,[r1]
62950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s1,[r2]
63050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fsubs   s2, s0, s1
63150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fsts    s2,[r0]
63250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
63350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
63450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
63550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
63650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
63750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_MUL_FLOAT_VFP
63850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_MUL_FLOAT_VFP:
63950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_MUL_FLOAT_VFP.S */
64050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinop.S */
64150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
64250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32-bit floating point operation.  Provide an "instr" line that
64350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
64450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
64550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
64650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
64750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
64850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
64950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
65050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s0,[r1]
65150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s1,[r2]
65250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fmuls   s2, s0, s1
65350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fsts    s2,[r0]
65450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
65550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
65650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
65750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
65850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
65950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_DIV_FLOAT_VFP
66050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_DIV_FLOAT_VFP:
66150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_DIV_FLOAT_VFP.S */
66250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinop.S */
66350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
66450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32-bit floating point operation.  Provide an "instr" line that
66550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
66650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
66750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
66850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
66950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
67050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
67150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
67250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s0,[r1]
67350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     flds    s1,[r2]
67450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fdivs   s2, s0, s1
67550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fsts    s2,[r0]
67650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
67750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
67850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
67950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
68050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
68150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_ADD_DOUBLE_VFP
68250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_ADD_DOUBLE_VFP:
68350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_ADD_DOUBLE_VFP.S */
68450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinopWide.S */
68550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
68650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 64-bit floating point operation.  Provide an "instr" line that
68750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
68850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
68950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
69050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
69150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
69250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
69350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
69450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d0,[r1]
69550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d1,[r2]
69650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     faddd   d2, d0, d1
69750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fstd    d2,[r0]
69850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
69950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
70050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
70150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
70250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
70350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_SUB_DOUBLE_VFP
70450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_SUB_DOUBLE_VFP:
70550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_SUB_DOUBLE_VFP.S */
70650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinopWide.S */
70750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
70850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 64-bit floating point operation.  Provide an "instr" line that
70950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
71050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
71150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
71250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
71350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
71450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
71550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
71650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d0,[r1]
71750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d1,[r2]
71850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fsubd   d2, d0, d1
71950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fstd    d2,[r0]
72050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
72150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
72250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
72350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
72450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
72550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_MUL_DOUBLE_VFP
72650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_MUL_DOUBLE_VFP:
72750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_MUL_DOUBLE_VFP.S */
72850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinopWide.S */
72950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
73050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 64-bit floating point operation.  Provide an "instr" line that
73150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
73250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
73350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
73450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
73550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
73650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
73750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
73850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d0,[r1]
73950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d1,[r2]
74050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fmuld   d2, d0, d1
74150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fstd    d2,[r0]
74250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
74350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
74450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
74550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
74650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
74750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_DIV_DOUBLE_VFP
74850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_DIV_DOUBLE_VFP:
74950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_DIV_DOUBLE_VFP.S */
75050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/fbinopWide.S */
75150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
75250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 64-bit floating point operation.  Provide an "instr" line that
75350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * specifies an instruction that performs s2 = s0 op s1.
75450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
75550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
75650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
75750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = op1 address
75850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 = op2 address
75950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
76050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d0,[r1]
76150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fldd    d1,[r2]
76250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fdivd   d2, d0, d1
76350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     fstd    d2,[r0]
76450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     bx      lr
76550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
76650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
76750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
76850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
76950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_DOUBLE_TO_FLOAT_VFP
77050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_DOUBLE_TO_FLOAT_VFP:
77150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_DOUBLE_TO_FLOAT_VFP.S */
77250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/funopNarrower.S */
77350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
77450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 64bit-to-32bit floating point unary operation.  Provide an
77550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * "instr" line that specifies an instruction that performs "s0 = op d0".
77650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
77750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For: double-to-int, double-to-float
77850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
77950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
78050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
78150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = src dalvik register address
78250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
78350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* unop vA, vB */
78450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fldd    d0, [r1]                    @ d0<- vB
78550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fcvtsd  s0, d0                              @ s0<- op d0
78650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fsts    s0, [r0]                    @ vA<- s0
78750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
78850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
78950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
79050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
79150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
79250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_DOUBLE_TO_INT_VFP
79350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_DOUBLE_TO_INT_VFP:
79450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_DOUBLE_TO_INT_VFP.S */
79550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/funopNarrower.S */
79650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
79750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 64bit-to-32bit floating point unary operation.  Provide an
79850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * "instr" line that specifies an instruction that performs "s0 = op d0".
79950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
80050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For: double-to-int, double-to-float
80150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
80250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
80350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
80450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = src dalvik register address
80550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
80650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* unop vA, vB */
80750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fldd    d0, [r1]                    @ d0<- vB
80850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ftosizd  s0, d0                              @ s0<- op d0
80950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fsts    s0, [r0]                    @ vA<- s0
81050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
81150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
81250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
81350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
81450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
81550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_FLOAT_TO_DOUBLE_VFP
81650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_FLOAT_TO_DOUBLE_VFP:
81750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_FLOAT_TO_DOUBLE_VFP.S */
81850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/funopWider.S */
81950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
82050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32bit-to-64bit floating point unary operation.  Provide an
82150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * "instr" line that specifies an instruction that performs "d0 = op s0".
82250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
82350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For: int-to-double, float-to-double
82450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
82550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
82650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
82750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = src dalvik register address
82850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
82950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* unop vA, vB */
83050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s0, [r1]                    @ s0<- vB
83150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fcvtds  d0, s0                              @ d0<- op s0
83250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fstd    d0, [r0]                    @ vA<- d0
83350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
83450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
83550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
83650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
83750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
83850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_FLOAT_TO_INT_VFP
83950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_FLOAT_TO_INT_VFP:
84050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_FLOAT_TO_INT_VFP.S */
84150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/funop.S */
84250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
84350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32bit-to-32bit floating point unary operation.  Provide an
84450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * "instr" line that specifies an instruction that performs "s1 = op s0".
84550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
84650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For: float-to-int, int-to-float
84750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
84850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
84950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
85050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = src dalvik register address
85150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
85250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* unop vA, vB */
85350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s0, [r1]                    @ s0<- vB
85450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ftosizs s1, s0                              @ s1<- op s0
85550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fsts    s1, [r0]                    @ vA<- s1
85650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
85750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
85850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
85950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
86050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
86150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_INT_TO_DOUBLE_VFP
86250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_INT_TO_DOUBLE_VFP:
86350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_INT_TO_DOUBLE_VFP.S */
86450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/funopWider.S */
86550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
86650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32bit-to-64bit floating point unary operation.  Provide an
86750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * "instr" line that specifies an instruction that performs "d0 = op s0".
86850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
86950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For: int-to-double, float-to-double
87050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
87150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
87250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
87350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = src dalvik register address
87450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
87550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* unop vA, vB */
87650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s0, [r1]                    @ s0<- vB
87750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fsitod  d0, s0                              @ d0<- op s0
87850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fstd    d0, [r0]                    @ vA<- d0
87950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
88050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
88150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
88250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
88350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
88450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_INT_TO_FLOAT_VFP
88550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_INT_TO_FLOAT_VFP:
88650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_INT_TO_FLOAT_VFP.S */
88750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/funop.S */
88850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
88950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Generic 32bit-to-32bit floating point unary operation.  Provide an
89050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * "instr" line that specifies an instruction that performs "s1 = op s0".
89150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
89250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * For: float-to-int, int-to-float
89350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
89450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
89550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0 = target dalvik register address
89650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r1 = src dalvik register address
89750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
89850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* unop vA, vB */
89950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s0, [r1]                    @ s0<- vB
90050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fsitos  s1, s0                              @ s1<- op s0
90150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fsts    s1, [r0]                    @ vA<- s1
90250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
90350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
90450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
90550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
90650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
90750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_CMPG_DOUBLE_VFP
90850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_CMPG_DOUBLE_VFP:
90950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_CMPG_DOUBLE_VFP.S */
91050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
91150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Compare two floating-point values.  Puts 0, 1, or -1 into the
91250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * destination register based on the results of the comparison.
91350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
91450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * int compare(x, y) {
91550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     if (x == y) {
91650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 0;
91750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x < y) {
91850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return -1;
91950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x > y) {
92050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 1;
92150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else {
92250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 1;
92350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     }
92450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * }
92550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
92650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
92750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r0 = &op1 [vBB]
92850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r1 = &op2 [vCC]
92950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
93050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* op vAA, vBB, vCC */
93150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fldd    d0, [r0]                    @ d0<- vBB
93250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fldd    d1, [r1]                    @ d1<- vCC
9337fb2edd2f69d11435da8dc0f1c251349238863b3Bill Buzbee    fcmpd  d0, d1                       @ compare (vBB, vCC)
93450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0, #1                      @ r0<- 1 (default)
93550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fmstat                              @ export status flags
93650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mvnmi   r0, #0                      @ (less than) r0<- -1
93750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    moveq   r0, #0                      @ (equal) r0<- 0
93850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
93950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
94050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
94150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
94250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_CMPL_DOUBLE_VFP
94350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_CMPL_DOUBLE_VFP:
94450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_CMPL_DOUBLE_VFP.S */
94550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
94650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Compare two floating-point values.  Puts 0, 1, or -1 into the
94750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * destination register based on the results of the comparison.
94850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
94950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * int compare(x, y) {
95050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     if (x == y) {
95150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 0;
95250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x > y) {
95350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 1;
95450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x < y) {
95550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return -1;
95650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else {
95750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return -1;
95850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     }
95950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * }
96050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
96150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r0 = &op1 [vBB]
96250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r1 = &op2 [vCC]
96350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
96450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* op vAA, vBB, vCC */
96550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fldd    d0, [r0]                    @ d0<- vBB
96650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fldd    d1, [r1]                    @ d1<- vCC
96750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fcmped  d0, d1                      @ compare (vBB, vCC)
96850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mvn     r0, #0                      @ r0<- -1 (default)
96950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fmstat                              @ export status flags
97050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    movgt   r0, #1                      @ (greater than) r0<- 1
97150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    moveq   r0, #0                      @ (equal) r0<- 0
97250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
97350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
97450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
97550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
97650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_CMPG_FLOAT_VFP
97750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_CMPG_FLOAT_VFP:
97850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_CMPG_FLOAT_VFP.S */
97950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
98050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Compare two floating-point values.  Puts 0, 1, or -1 into the
98150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * destination register based on the results of the comparison.
98250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
98350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * int compare(x, y) {
98450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     if (x == y) {
98550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 0;
98650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x < y) {
98750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return -1;
98850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x > y) {
98950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 1;
99050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else {
99150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 1;
99250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     }
99350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * }
99450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
99550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r0 = &op1 [vBB]
99650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r1 = &op2 [vCC]
99750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
99850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* op vAA, vBB, vCC */
99950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s0, [r0]                    @ d0<- vBB
100050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s1, [r1]                    @ d1<- vCC
10017fb2edd2f69d11435da8dc0f1c251349238863b3Bill Buzbee    fcmps  s0, s1                      @ compare (vBB, vCC)
100250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0, #1                      @ r0<- 1 (default)
100350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fmstat                              @ export status flags
100450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mvnmi   r0, #0                      @ (less than) r0<- -1
100550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    moveq   r0, #0                      @ (equal) r0<- 0
100650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
100750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
100850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
100950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
101050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_CMPL_FLOAT_VFP
101150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_CMPL_FLOAT_VFP:
101250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_CMPL_FLOAT_VFP.S */
101350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
101450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Compare two floating-point values.  Puts 0, 1, or -1 into the
101550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * destination register based on the results of the comparison.
101650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
101750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * int compare(x, y) {
101850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     if (x == y) {
101950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 0;
102050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x > y) {
102150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return 1;
102250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else if (x < y) {
102350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return -1;
102450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     } else {
102550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *         return -1;
102650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     }
102750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * }
102850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
102950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r0 = &op1 [vBB]
103050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *    r1 = &op2 [vCC]
103150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
103250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* op vAA, vBB, vCC */
103350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s0, [r0]                    @ d0<- vBB
103450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    flds    s1, [r1]                    @ d1<- vCC
10357fb2edd2f69d11435da8dc0f1c251349238863b3Bill Buzbee    fcmps  s0, s1                      @ compare (vBB, vCC)
103650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mvn     r0, #0                      @ r0<- -1 (default)
103750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fmstat                              @ export status flags
103850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    movgt   r0, #1                      @ (greater than) r0<- 1
103950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    moveq   r0, #0                      @ (equal) r0<- 0
104050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      lr
104150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
104250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* ------------------------------ */
104350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .balign 4
104450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dvmCompiler_TEMPLATE_SQRT_DOUBLE_VFP
104550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedvmCompiler_TEMPLATE_SQRT_DOUBLE_VFP:
104650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te-vfp/TEMPLATE_SQRT_DOUBLE_VFP.S */
104750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
104850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * 64-bit floating point vfp sqrt operation.
104950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * If the result is a NaN, bail out to library code to do
105050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * the right thing.
105150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *
105250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On entry:
105350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r2 src addr of op1
105450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * On exit:
105550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     *     r0,r1 = res
105650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
105750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fldd    d0, [r2]
105850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fsqrtd  d1, d0
105950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fcmpd   d1, d1
106050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fmstat
106150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fmrrd   r0, r1, d1
106250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bxeq    lr   @ Result OK - return
106350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r2, .Lsqrt
106450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    fmrrd   r0, r1, d0   @ reload orig operand
106550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    bx      r2   @ tail call to sqrt library routine
106650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
106750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.Lsqrt:
106850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .word   sqrt
106950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
10704f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* ------------------------------ */
10714f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .balign 4
10724f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    .global dvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON
10734f48917c0741e4d9b15ca7c45956aea05fea103fBen ChengdvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON:
10744f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* File: armv5te/TEMPLATE_THROW_EXCEPTION_COMMON.S */
10754f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    /*
10764f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * Throw an exception from JIT'ed code.
10774f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     * On entry:
10784f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     *    r0    Dalvik PC that raises the exception
10794f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng     */
10804f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    b       .LhandleException
10814f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
10821465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* ------------------------------ */
10831465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    .balign 4
10849e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .global dvmCompiler_TEMPLATE_MEM_OP_DECODE
10859e45c0b968d63ea38353c99252d233879c2efdafjeffhaodvmCompiler_TEMPLATE_MEM_OP_DECODE:
10869e45c0b968d63ea38353c99252d233879c2efdafjeffhao/* File: armv5te-vfp/TEMPLATE_MEM_OP_DECODE.S */
10879e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
10881465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    /*
10899e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler encapsulates heap memory ops for selfVerification mode.
10901465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     *
10919e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * The call to the handler is inserted prior to a heap memory operation.
10929e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * This handler then calls a function to decode the memory op, and process
10939e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * it accordingly. Afterwards, the handler changes the return address to
10949e45c0b968d63ea38353c99252d233879c2efdafjeffhao     * skip the memory op so it never gets executed.
10951465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     */
10969e45c0b968d63ea38353c99252d233879c2efdafjeffhao    vpush   {d0-d15}                    @ save out all fp registers
10979e45c0b968d63ea38353c99252d233879c2efdafjeffhao    push    {r0-r12,lr}                 @ save out all registers
1098d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng    ldr     r2, .LdvmSelfVerificationMemOpDecode @ defined in footer.S
10999e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r0, lr                      @ arg0 <- link register
11009e45c0b968d63ea38353c99252d233879c2efdafjeffhao    mov     r1, sp                      @ arg1 <- stack pointer
11019e45c0b968d63ea38353c99252d233879c2efdafjeffhao    blx     r2                          @ decode and handle the mem op
11029e45c0b968d63ea38353c99252d233879c2efdafjeffhao    pop     {r0-r12,lr}                 @ restore all registers
11039e45c0b968d63ea38353c99252d233879c2efdafjeffhao    vpop    {d0-d15}                    @ restore all fp registers
11049e45c0b968d63ea38353c99252d233879c2efdafjeffhao    bx      lr                          @ return to compiled code
11059e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
11061465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee
1107fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
1108fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
1109fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_COMPARETO
1110fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_COMPARETO:
1111fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_COMPARETO.S */
1112fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
1113fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's compareTo.
1114fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1115fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0/r1 to have been previously checked for null.  Will
1116fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return negative if this's string is < comp, 0 if they are the
1117fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * same and positive if >.
1118fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1119fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
1120fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1121fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
1122fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync with definitions in UtfString.h.  See asm-constants.h
1123fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1124fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
1125fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   this object pointer
1126fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   comp object pointer
1127fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1128fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
1129fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1130fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov    r2, r0         @ this to r2, opening up r0 for return value
1131fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs   r0, r2, r1     @ Same?
1132fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxeq   lr
1133fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1134fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r4, [r2, #STRING_FIELDOFF_OFFSET]
1135fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r9, [r1, #STRING_FIELDOFF_OFFSET]
1136fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r2, #STRING_FIELDOFF_COUNT]
1137fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r10, [r1, #STRING_FIELDOFF_COUNT]
1138fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r2, [r2, #STRING_FIELDOFF_VALUE]
1139fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r1, [r1, #STRING_FIELDOFF_VALUE]
1140fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1141fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
1142fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
1143fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    value:  r2/r1
1144fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    offset: r4/r9
1145fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    count:  r7/r10
1146fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * We're going to compute
1147fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r11 <- countDiff
1148fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r10 <- minCount
1149fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
1150fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     subs  r11, r7, r10
1151fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movls r10, r7
1152fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1153fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Now, build pointers to the string data */
1154fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, r2, r4, lsl #1
1155fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, r1, r9, lsl #1
1156fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
1157fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * Note: data pointers point to previous element so we can use pre-index
1158fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * mode with base writeback.
1159fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
1160fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r2, #16-2   @ offset to contents[-1]
1161fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r1, #16-2   @ offset to contents[-1]
1162fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1163fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
1164fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
1165fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r2: *this string data
1166fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r1: *comp string data
1167fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r10: iteration count for comparison
1168fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r11: value to return if the first part of the string is equal
1169fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r0: reserved for result
1170fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      *   r3, r4, r7, r8, r9, r12 available for loading string data
1171fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
1172fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
11734c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #2
11744c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blt   do_remainder2
11754c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
11764c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee      /*
11774c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * Unroll the first two checks so we can quickly catch early mismatch
11784c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       * on long strings (but preserve incoming alignment)
11794c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee       */
11804c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
11814c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r3, [r2, #2]!
11824c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r4, [r1, #2]!
11834c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r7, [r2, #2]!
11844c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldrh  r8, [r1, #2]!
11854c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r0, r3, r4
11864c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subeqs  r0, r7, r8
11874c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  lr
11884c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r10, #28
11894c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bgt   do_memcmp16
11904c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    subs  r10, #3
1191fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    blt   do_remainder
11924c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
1193fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_triple:
1194fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
1195fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
1196fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r7, [r2, #2]!
1197fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r8, [r1, #2]!
1198fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r9, [r2, #2]!
1199fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r12,[r1, #2]!
1200fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
1201fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r7, r8
1202fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subeqs  r0, r9, r12
1203fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
1204fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #3
12055965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    bge   loopback_triple
1206fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1207fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeedo_remainder:
12085965d47b624798343b6a53afd384f2cf88d091deBill Buzbee    adds  r10, #3
1209fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   returnDiff
1210fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1211fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_single:
1212fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r2, #2]!
1213fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r1, #2]!
1214fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r0, r3, r4
1215fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bxne  lr
1216fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r10, #1
1217fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bne     loopback_single
1218fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1219fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeereturnDiff:
1220fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, r11
1221fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1222fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
12234c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_remainder2:
12244c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    adds  r10, #2
12254c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bne   loopback_single
12264c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r11
12274c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    lr
12284c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
12294c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    /* Long string case */
12304c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_memcmp16:
12314c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r4, lr
12324c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    ldr   lr, .Lmemcmp16
12334c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r7, r11
12344c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r0, r2, #2
12354c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    add   r1, r1, #2
12364c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r2, r10
12374c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    blx   lr
12384c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    cmp   r0, #0
12394c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bxne  r4
12404c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    mov   r0, r7
12414c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    bx    r4
12424c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
12434c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee.Lmemcmp16:
12444c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee    .word __memcmp16
12454c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee
1246fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */
1247fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .balign 4
1248fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    .global dvmCompiler_TEMPLATE_STRING_INDEXOF
1249fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_INDEXOF:
1250fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_INDEXOF.S */
1251fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
1252fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * String's indexOf.
1253fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1254fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * Requires r0 to have been previously checked for null.  Will
1255fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * return index of match of r1 in r0.
1256fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1257fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * IMPORTANT NOTE:
1258fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1259fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * This code relies on hard-coded offsets for string objects, and must be
1260fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * kept in sync wth definitions in UtfString.h  See asm-constants.h
1261fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *
1262fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * On entry:
1263fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r0:   string object pointer
1264fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r1:   char to match
1265fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     *    r2:   Starting offset in string data
1266fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
1267fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1268fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r7, [r0, #STRING_FIELDOFF_OFFSET]
1269fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r8, [r0, #STRING_FIELDOFF_COUNT]
1270fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldr    r0, [r0, #STRING_FIELDOFF_VALUE]
1271fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1272fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    /*
1273fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     * At this point, we have:
127449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r0: object pointer
127549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r1: char to match
127649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r2: starting offset
127749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r7: offset
127849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *    r8: string length
1279fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     */
1280fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
128149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of string data */
128249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     add   r0, #16
128349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     add   r0, r0, r7, lsl #1
128449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
128549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Save a copy of starting data in r7 */
128649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     mov   r7, r0
128749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
1288fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /* Clamp start to [0..count] */
1289fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, #0
1290fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     movlt r2, #0
1291fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     cmp   r2, r8
129249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     movgt r2, r8
1293fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
129449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Build pointer to start of data to compare and pre-bias */
1295fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     add   r0, r0, r2, lsl #1
129649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r0, #2
129749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
129849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     /* Compute iteration count */
129949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     sub   r8, r2
1300fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1301fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee     /*
1302fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      * At this point we have:
130349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r0: start of data to test
130449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r1: chat to compare
130549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r8: iteration count
130649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r7: original start of string
130749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee      *   r3, r4, r9, r10, r11, r12 available for loading string data
1308fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee      */
1309fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1310ab875c79c56eacc510b09710d38a9b20f7337486Bill Buzbee    subs  r8, #4
131149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    blt   indexof_remainder
1312fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
131349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop4:
1314fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1315fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r4, [r0, #2]!
131649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r10, [r0, #2]!
131749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    ldrh  r11, [r0, #2]!
1318fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1319fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_0
1320fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r4, r1
1321fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_1
132249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r10, r1
1323fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_2
132449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    cmp   r11, r1
1325fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1326fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #4
132749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bge   indexof_loop4
1328fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
132949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_remainder:
133049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    adds    r8, #4
133149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    beq     indexof_nomatch
1332fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
133349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop1:
1334fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    ldrh  r3, [r0, #2]!
1335fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    cmp   r3, r1
1336fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    beq   match_3
1337fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    subs  r8, #1
133849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    bne   indexof_loop1
1339fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
134049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_nomatch:
1341fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    mov   r0, #-1
1342fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1343fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
1344fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_0:
1345fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #6
134649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
134749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1348fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1349fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_1:
1350fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #4
135149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
135249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1353fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1354fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_2:
1355fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    sub   r0, #2
135649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
135749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1358fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1359fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_3:
136049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    sub   r0, r7
136149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    asr   r0, r0, #1
1362fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee    bx    lr
1363fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee
13649a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* ------------------------------ */
13659a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .balign 4
13669a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .global dvmCompiler_TEMPLATE_INTERPRET
13679a8c75adb2abf551d06dbf757bff558c1feded08Bill BuzbeedvmCompiler_TEMPLATE_INTERPRET:
13689a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* File: armv5te/TEMPLATE_INTERPRET.S */
13699a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
13709a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * This handler transfers control to the interpeter without performing
13719a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * any lookups.  It may be called either as part of a normal chaining
13729a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * operation, or from the transition code in header.S.  We distinquish
13739a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * the two cases by looking at the link register.  If called from a
1374bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee     * translation chain, it will point to the chaining Dalvik PC -3.
13759a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * On entry:
13769a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    lr - if NULL:
13779a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *        r1 - the Dalvik PC to begin interpretation.
13789a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    else
1379bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee     *        [lr, #3] contains Dalvik PC to begin interpretation
13809f601a917c8878204482c37aec7005054b6776fabuzbee     *    rSELF - pointer to thread
13819a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     *    rFP - Dalvik frame pointer
13829a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
13839a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    cmp     lr, #0
13848c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#if defined(WORKAROUND_CORTEX_A9_745320)
13858c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    /* Don't use conditional loads if the HW defect exists */
13868c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    beq     101f
13878c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r1,[lr, #3]
13888c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng101:
13898c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#else
1390bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee    ldrne   r1,[lr, #3]
13918c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#endif
13929a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr     r2, .LinterpPunt
13939a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r0, r1                       @ set Dalvik PC
13949a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bx      r2
13959a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    @ doesn't return
13969a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
13979a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee.LinterpPunt:
13989a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    .word   dvmJitToInterpPunt
13999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
1400c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1401c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1402c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER
1403c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER:
1404c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER.S */
1405c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1406c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Call out to the runtime to lock an object.  Because this thread
1407c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * may have been suspended in THREAD_MONITOR state and the Jit's
1408c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * translation cache subsequently cleared, we cannot return directly.
1409c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * Instead, unconditionally transition to the interpreter to resume.
1410c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1411c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1412c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1413c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1414c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
141579842ac67e2a23cb544bfe1ee3961d325a2552e7Bill Buzbee     */
1416c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1417c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1418c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1419c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2                           @ dvmLockObject(self, obj)
1420c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmJitToInterpNoChain
1421c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1422978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1423eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1424eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1425c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1426c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
1427c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* ------------------------------ */
1428c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .balign 4
1429c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .global dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG
1430c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill BuzbeedvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
1431c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee/* File: armv5te/TEMPLATE_MONITOR_ENTER_DEBUG.S */
1432c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    /*
1433c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * To support deadlock prediction, this version of MONITOR_ENTER
1434c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * will always call the heavyweight dvmLockObject, check for an
1435c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * exception and then bail out to the interpreter.
1436c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1437c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     * On entry:
1438c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r0 - self pointer
1439c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r1 - the object (which has already been null-checked by the caller
1440c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *    r4 - the Dalvik PC of the following instruction.
1441c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     *
1442c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee     */
1443c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LdvmLockObject
1444c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    mov     r3, #0                       @ Record that we're not returning
1445c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    str     r3, [r0, #offThread_inJitCodeCache]
1446c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    blx     r2             @ dvmLockObject(self, obj)
144799e3e6e72e3471eb85fc2e405866392b01c080febuzbee    @ test for exception
14489f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception]
1449c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    cmp     r1, #0
1450c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    beq     1f
1451c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     r2, .LhandleException
1452c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    sub     r0, r4, #2     @ roll dPC back to this monitor instruction
1453c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    bx      r2
1454c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee1:
1455c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    @ Bail to interpreter - no chain [note - r4 still contains rPC]
1456978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1457eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee    mov     r0, #kHeavyweightMonitor
1458eb695c6f814f6b0bdbba0e837555d3fe5ad23104Bill Buzbee#endif
1459c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    ldr     pc, .LdvmJitToInterpNoChain
1460c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee
14612e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* ------------------------------ */
14622e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .balign 4
14632e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .global dvmCompiler_TEMPLATE_PERIODIC_PROFILING
14642e152baec01433de9c63633ebc6f4adf1cea3a87buzbeedvmCompiler_TEMPLATE_PERIODIC_PROFILING:
14652e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* File: armv5te/TEMPLATE_PERIODIC_PROFILING.S */
14662e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    /*
14672e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * Increment profile counter for this trace, and decrement
14682e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * sample counter.  If sample counter goes below zero, turn
14692e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * off profiling.
14702e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *
14712e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * On entry
14722e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     * (lr-11) is address of pointer to counter.  Note: the counter
14732e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *    actually exists 10 bytes before the return target, but because
14742e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     *    we are arriving from thumb mode, lr will have its low bit set.
14752e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     */
14762e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r0, [lr,#-11]
14779f601a917c8878204482c37aec7005054b6776fabuzbee     ldr    r1, [rSELF, #offThread_pProfileCountdown]
14782e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r2, [r0]                    @ get counter
14792e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r3, [r1]                    @ get countdown timer
14802e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     add    r2, #1
14812e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     subs   r2, #1
14822e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     blt    .LTEMPLATE_PERIODIC_PROFILING_disable_profiling
14832e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     str    r2, [r0]
14842e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     str    r3, [r1]
14852e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     bx     lr
14862e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
14872e152baec01433de9c63633ebc6f4adf1cea3a87buzbee.LTEMPLATE_PERIODIC_PROFILING_disable_profiling:
14882e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     mov    r4, lr                     @ preserve lr
14892e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     ldr    r0, .LdvmJitTraceProfilingOff
14902e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     blx    r0
14912e152baec01433de9c63633ebc6f4adf1cea3a87buzbee     bx     r4
14922e152baec01433de9c63633ebc6f4adf1cea3a87buzbee
149318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
149418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
149518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_RETURN_PROF
149618fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_RETURN_PROF:
149718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_RETURN_PROF.S */
149818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
149918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_RETURN.S */
150018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
150118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX.
150218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * If the stored value in returnAddr
150318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * is non-zero, the caller is compiled by the JIT thus return to the
150418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * address in the code cache following the invoke instruction. Otherwise
150518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * return to the special dvmJitToInterpNoChain entry point.
150618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
150718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
150818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r2,lr}             @ preserve live registers
150918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, r6
15109f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=rSELF
151118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
15129a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     pc, .LdvmFastMethodTraceExit
151318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r2,lr}             @ restore live registers
151418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
151518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r0, rFP)           @ r0<- saveArea (old)
151618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r0, #offStackSaveArea_prevFrame] @ r10<- saveArea->prevFrame
15179a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
151818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     rPC, [r0, #offStackSaveArea_savedPc] @ rPC<- saveArea->savedPc
151918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
152018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9,  [r0, #offStackSaveArea_returnAddr] @ r9<- chaining cell ret
152118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
152218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r9, #0                      @ disable chaining
152318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
152418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)]
152518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee                                        @ r2<- method we're returning to
152618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r2, #0                      @ break frame?
152718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
152818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     1f                          @ bail to interpreter
152918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
153018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blxeq   lr                          @ punt to interpreter and compare state
153118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
153218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r1, .LdvmJitToInterpNoChainNoProfile @ defined in footer.S
153318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r10                    @ publish new FP
153418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
153518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
15369f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
153718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex
153830bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame] @ curFrame = fp
153918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     rPC, rPC, #6                @ publish new rPC (advance 6 bytes)
15409f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_methodClassDex]
15419a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ check the break flags
154218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    movne   r9, #0                      @ clear the chaining cell address
15439f601a917c8878204482c37aec7005054b6776fabuzbee    str     r9, [rSELF, #offThread_inJitCodeCache] @ in code cache or not
154418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r9, #0                      @ chaining cell exists?
154518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blxne   r9                          @ jump to the chaining cell
154618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
154718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kCallsiteInterpreted
154818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
154918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r1                      @ callsite is interpreted
155018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee1:
1551d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    mov     r0, #0
1552d5f6ef487f2fc6edb8c1e6394d2a82712169f491buzbee    str     r0, [rSELF, #offThread_inJitCodeCache] @ reset inJitCodeCache
15539f601a917c8878204482c37aec7005054b6776fabuzbee    stmia   rSELF, {rPC, rFP}           @ SAVE_PC_FP_TO_SELF()
155418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, .LdvmMterpStdBail       @ defined in footer.S
15559f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ Expecting rSELF in r0
155618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blx     r2                          @ exit the interpreter
155718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
155818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
155918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
156018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
156118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
156218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT_PROF
156318fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT_PROF:
156418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT_PROF.S */
156518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
156618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */
156718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
156818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
156918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
157018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * runtime-resolved callee.
157118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
157218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
157318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
157418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
15759f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
15769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
157718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
157818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
157918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
158018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
158118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
158218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
158318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    lr                          @ return to raise stack overflow excep.
158418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
158518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
158618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
158718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
158818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
158918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
159018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
159118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
159218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
159318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
159418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
159518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
15969a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
159718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
159818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    tst     r10, #ACC_NATIVE
159918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
160018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     .LinvokeNative
160118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
160218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
160318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
160418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
160518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
160618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
160718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
16089f601a917c8878204482c37aec7005054b6776fabuzbee    @ Update "thread" values for the new method
16099f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
16109f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
161118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r1                         @ fp = newFp
161230bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
161318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
161418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r3}                    @ preserve r0-r3
161518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
16169f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=methodToCall, r1=rSELF
161718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
161818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastMethodTraceEnter
161918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r3}                    @ restore r0-r3
162018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
162118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
162218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ Start executing the callee
162318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
162418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kInlineCacheMiss
162518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
162618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
162718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
162818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
162918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
163018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
163118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
163218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN_PROF
163318fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN_PROF:
163418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN_PROF.S */
163518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
163618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */
163718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
163818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For monomorphic callsite, setup the Dalvik frame and return to the
163918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Thumb code through the link register to transfer control to the callee
164018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * method through a dedicated chaining cell.
164118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
164218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize
164318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ rPC = dalvikCallsite, r7 = methodToCall->registersSize
164418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ methodToCall is guaranteed to be non-native
164518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee.LinvokeChainProf:
16469f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
16479a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags]        @ r8<- breakFlags
164818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
164918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
165018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
165118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
165218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r12, lr, #2                 @ setup the punt-to-interp address
165318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
165418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
165518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    r12                         @ return to raise stack overflow excep.
165618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
165718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
165818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
165918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
166018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
166118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
166218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
166318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
166418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
16659a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
166618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    r12                         @ bail to the interpreter
166718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
166818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
166918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
16709f601a917c8878204482c37aec7005054b6776fabuzbee    @ Update "thread" values for the new method
16719f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
16729f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
167318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     rFP, r1                         @ fp = newFp
167430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
167518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
167618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r2,lr}             @ preserve clobbered live registers
167718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
16789f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=methodToCall, r1=rSELF
167918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
168018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastMethodTraceEnter
168118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r2,lr}             @ restore registers
168218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
168318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
168418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr                              @ return to the callee-chaining cell
168518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
168618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
168718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
168818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
168918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
169018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF
169118fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF:
169218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN_PROF.S */
169318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
169418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */
169518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
169618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * For polymorphic callsite, check whether the cached class pointer matches
169718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * the current one. If so setup the Dalvik frame and return to the
169818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Thumb code through the link register to transfer control to the callee
169918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * method through a dedicated chaining cell.
170018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
170118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * The predicted chaining cell is declared in ArmLIR.h with the
170218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * following layout:
170318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
170418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *  typedef struct PredictedChainingCell {
170518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      u4 branch;
170618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      const ClassObject *clazz;
170718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      const Method *method;
170818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *      u4 counter;
170918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *  } PredictedChainingCell;
171018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *
171118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * Upon returning to the callsite:
171218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr  : to branch to the chaining cell
171318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr+2: to punt to the interpreter
171418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *    - lr+4: to fully resolve the callee and may rechain.
171518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *            r3 <- class
171618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     *            r9 <- counter
171718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
171818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite
171918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r3, [r0, #offObject_clazz]  @ r3 <- this->class
172018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r2, #4]    @ r8 <- predictedChainCell->clazz
172118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r2, #8]    @ r0 <- predictedChainCell->method
17229f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_icRechainCount] @ r1 <- shared rechainCount
172318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r3, r8          @ predicted class == actual class?
172418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
172518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r7, .LdvmICHitCount
172618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WORKAROUND_CORTEX_A9_745320)
172718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /* Don't use conditional loads if the HW defect exists */
172818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     101f
172918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r10, [r7, #0]
173018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee101:
173118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
173218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreq   r10, [r7, #0]
173318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
173418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r10, r10, #1
173518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    streq   r10, [r7, #0]
173618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
173718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreqh  r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
173818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldreqh  r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
173918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     .LinvokeChainProf   @ predicted chain is valid
174018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r7, [r3, #offClassObject_vtable] @ r7 <- this->class->vtable
174118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r8, #0          @ initialized class or not
174218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    moveq   r1, #0
174318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    subne   r1, r9, #1      @ count--
17449f601a917c8878204482c37aec7005054b6776fabuzbee    strne   r1, [rSELF, #offThread_icRechainCount]  @ write back to thread
174518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     lr, lr, #4      @ return to fully-resolve landing pad
174618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    /*
174718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r1 <- count
174818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r2 <- &predictedChainCell
174918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r3 <- this->class
175018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r4 <- dPC
175118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     * r7 <- this->class->vtable
175218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee     */
175318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr
175418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
175518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
175618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
175718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* ------------------------------ */
175818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .balign 4
175918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE_PROF
176018fba346582c08d81aa96d9508c0e935bad5f36fbuzbeedvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE_PROF:
176118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE_PROF.S */
176218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#define TEMPLATE_INLINE_PROFILING
176318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */
176418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
176518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r7 = methodToCall->registersSize
17669f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
17679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb    r8, [rSELF, #offThread_breakFlags]        @ r8<- breakFlags
176818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     r3, r1, #1  @ Thumb addr is odd
176918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
177018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
177118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
177218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r10, r9                     @ bottom < interpStackEnd?
177318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxlo    lr                          @ return to raise stack overflow excep.
177418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
177518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
177618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
177718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
177818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ set up newSaveArea
177918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
178018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
178118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
17829a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r8, #0                      @ breakFlags != 0
178318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
178418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if !defined(WITH_SELF_VERIFICATION)
178518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    lr                          @ bail to the interpreter
178618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#else
178718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bx      lr                          @ bail to interpreter unconditionally
178818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
178918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
179018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ go ahead and transfer control to the native code
17919f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
179218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r2, #0
179330bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
17949f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ not in the jit code cache
179518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
179618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee                                        @ newFp->localRefCookie=top
179718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
179818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
17999f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r2, r0                        @ arg2<- methodToCall
18009f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, r1                        @ arg0<- newFP
18019f601a917c8878204482c37aec7005054b6776fabuzbee    add     r1, rSELF, #offThread_retval  @ arg1<- &retval
18029f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r3, rSELF                     @ arg3<- self
180318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
18049f601a917c8878204482c37aec7005054b6776fabuzbee    @ r2=methodToCall, r6=rSELF
180518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r2,r6}                @ to be consumed after JNI return
180618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    stmfd   sp!, {r0-r3}                @ preserve r0-r3
180718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, r2
180818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r1, r6
18099f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=JNIMethod, r1=rSELF
181018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
181118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastMethodTraceEnter
181218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r3}                @ restore r0-r3
181318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
181418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
181518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    blx     r8                          @ off to the native code
181618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
181718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING)
181818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldmfd   sp!, {r0-r1}                @ restore r2 and r6
18199f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=JNIMethod, r1=rSELF
182018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
182118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, .LdvmFastNativeMethodTraceExit
182218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
18239f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
182418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ equivalent to dvmPopJniLocals
182518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
182618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
18279f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception] @ check for exception
182830bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
182918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r1, #0                      @ null?
18309f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
183118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
183218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
183318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ r0 = dalvikCallsitePC
183418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bne     .LhandleException           @ no, handle exception
183518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
18369f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ set the mode properly
183718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    cmp     r2, #0                      @ return chaining cell still exists?
183818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    bxne    r2                          @ yes - go ahead
183918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
184018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    @ continue executing the next instruction through the interpreter
184118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
184218fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
184318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(WITH_JIT_TUNING)
184418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     r0, #kCallsiteInterpreted
184518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#endif
184618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     pc, r1
184718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
184818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#undef TEMPLATE_INLINE_PROFILING
184918fba346582c08d81aa96d9508c0e935bad5f36fbuzbee
185050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .size   dvmCompilerTemplateStart, .-dvmCompilerTemplateStart
185150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* File: armv5te/footer.S */
185250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
185350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * ===========================================================================
185450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee *  Common subroutines and data
185550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * ===========================================================================
185650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
185750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
185850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .text
185950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .align  2
186050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LinvokeNative:
186150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ Prep for the native call
186250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ r1 = newFP, r0 = methodToCall
18637a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
18649f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
18659f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache
186630bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
1867d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
1868d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
1869389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    lr, [rSELF, #offThread_subMode]
187050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
187150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
187250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r2, r0                      @ r2<- methodToCall
187350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    mov     r0, r1                      @ r0<- newFP
18749f601a917c8878204482c37aec7005054b6776fabuzbee    add     r1, rSELF, #offThread_retval  @ r1<- &retval
18759f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r3, rSELF                   @ arg3<- self
187618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ands    lr, #kSubModeMethodTrace
187718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    beq     121f                        @ hop if not profiling
18789f601a917c8878204482c37aec7005054b6776fabuzbee    @ r2: methodToCall, r6: rSELF
18795cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r2,r6}
18805cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    stmfd   sp!, {r0-r3}
18815cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r0, r2
18825cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    mov     r1, r6
188313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
188413fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastMethodTraceEnter
18855cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r3}
188650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
188713fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
188813fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, [r2, #offMethod_nativeFunc]
188950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
18905cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    ldmfd   sp!, {r0-r1}
189113fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    mov     lr, pc
189213fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee    ldr     pc, .LdvmFastNativeMethodTraceExit
189318fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    b       212f
189418fba346582c08d81aa96d9508c0e935bad5f36fbuzbee121:
189518fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    mov     lr, pc
189618fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     pc, [r2, #offMethod_nativeFunc]
189718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee212:
1898964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
18999f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
190050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    @ equivalent to dvmPopJniLocals
190150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
1902d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
19039f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception] @ check for exception
190430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
190550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    cmp     r1, #0                      @ null?
19069f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
19074f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
190860c24f436d603c564d5351a6f81821f12635733cBen Cheng
190960c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
191060c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
191160c24f436d603c564d5351a6f81821f12635733cBen Cheng
19129f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ set the new mode
191360c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
191460c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
191560c24f436d603c564d5351a6f81821f12635733cBen Cheng
191660c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
191740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
191860c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
1919978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
19207a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
19217a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
192260c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
192350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
19244f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/*
19254f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry:
19264f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0  Faulting Dalvik PC
19274f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */
192850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LhandleException:
192911d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#if defined(WITH_SELF_VERIFICATION)
193011d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    ldr     pc, .LdeadFood @ should not see this under self-verification mode
193111d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng.LdeadFood:
193211d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    .word   0xdeadf00d
193311d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#endif
19347a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
19359f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_inJitCodeCache] @ in interpreter land
19364f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func
193750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    ldr     rIBASE, .LdvmAsmInstructionStart    @ same as above
19384f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     rPC, r0                 @ reload the faulting Dalvik address
19394f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     pc, r1                  @ branch to dvmMterpCommonExceptionThrown
194050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
194150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .align  2
194250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LdvmAsmInstructionStart:
194350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .word   dvmAsmInstructionStart
19447a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng.LdvmJitToInterpNoChainNoProfile:
19457a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .word   dvmJitToInterpNoChainNoProfile
194640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng.LdvmJitToInterpTraceSelectNoChain:
194740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .word   dvmJitToInterpTraceSelectNoChain
194850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LdvmJitToInterpNoChain:
194950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .word   dvmJitToInterpNoChain
195050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LdvmMterpStdBail:
195150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .word   dvmMterpStdBail
195250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.LdvmMterpCommonExceptionThrown:
195350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .word   dvmMterpCommonExceptionThrown
1954c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee.LdvmLockObject:
1955c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .word   dvmLockObject
19562e152baec01433de9c63633ebc6f4adf1cea3a87buzbee.LdvmJitTraceProfilingOff:
19572e152baec01433de9c63633ebc6f4adf1cea3a87buzbee    .word   dvmJitTraceProfilingOff
1958978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1959978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng.LdvmICHitCount:
1960978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    .word   gDvmICHitCount
1961978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#endif
19629e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
19639e45c0b968d63ea38353c99252d233879c2efdafjeffhao.LdvmSelfVerificationMemOpDecode:
19649e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .word   dvmSelfVerificationMemOpDecode
19659e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
19665cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastMethodTraceEnter:
19675cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastMethodTraceEnter
19685cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng.LdvmFastNativeMethodTraceExit:
19695cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng    .word   dvmFastNativeMethodTraceExit
19709a3147c7412f4794434b4c2604aa2ba784867774buzbee.LdvmFastMethodTraceExit:
19719a3147c7412f4794434b4c2604aa2ba784867774buzbee    .word   dvmFastMethodTraceExit
197250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.L__aeabi_cdcmple:
197350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .word   __aeabi_cdcmple
197450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee.L__aeabi_cfcmple:
197550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .word   __aeabi_cfcmple
197650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
197750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    .global dmvCompilerTemplateEnd
197850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill BuzbeedmvCompilerTemplateEnd:
197950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
198050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#endif /* WITH_JIT */
19817a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
1982