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