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