CompilerTemplateAsm-armv5te.S revision 964a7b06a9134947b5985c7f712d18d57ed665d2
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 105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/platform.S */ 106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * =========================================================================== 108342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee * CPU-version-specific defines and utility 109ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * =========================================================================== 110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Macro for "MOV LR,PC / LDR PC,xxx", which is not allowed pre-ARMv5. 114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Jump to subroutine. 115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * May modify IP and LR. 117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.macro LDR_PC_LR source 119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov lr, pc 120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr pc, \source 121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.endm 122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompilerTemplateStart 125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .type dvmCompilerTemplateStart, %function 126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .text 127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompilerTemplateStart: 129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 131ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_CMP_LONG 133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMP_LONG: 134ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMP_LONG.S */ 135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Compare two 64-bit values. Puts 0, 1, or -1 into the destination 137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * register based on the results of the comparison. 138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We load the full values with LDM, but in practice many values could 140ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * be resolved by only looking at the high word. This could be made 141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * faster or slower by splitting the LDM into a pair of LDRs. 142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * If we just wanted to set condition flags, we could do this: 144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * subs ip, r0, r2 145ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * sbcs ip, r1, r3 146ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * subeqs ip, r0, r2 147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific 148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * integer value, which we can do with 2 conditional mov/mvn instructions 149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * (set 1, set -1; if they're equal we already have 0 in ip), giving 150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * us a constant 5-cycle path plus a branch at the end to the 151ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * instruction epilogue code. The multi-compare approach below needs 152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch 153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * in the worst case (the 64-bit values are equal). 154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* cmp-long vAA, vBB, vCC */ 156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r1, r3 @ compare (vBB+1, vCC+1) 157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng blt .LTEMPLATE_CMP_LONG_less @ signed compare on high part 158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bgt .LTEMPLATE_CMP_LONG_greater 159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng subs r0, r0, r2 @ r0<- r0 - r2 160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxeq lr 161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bhi .LTEMPLATE_CMP_LONG_greater @ unsigned compare on low part 162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMP_LONG_less: 163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mvn r0, #0 @ r0<- -1 164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr 165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMP_LONG_greater: 166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, #1 @ r0<- 1 167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr 168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 172ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_RETURN 173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_RETURN: 174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_RETURN.S */ 175ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX. 177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * If the stored value in returnAddr 178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * is non-zero, the caller is compiled by the JIT thus return to the 179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * address in the code cache following the invoke instruction. Otherwise 180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return to the special dvmJitToInterpNoChain entry point. 181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r0, rFP) @ r0<- saveArea (old) 183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r10, [r0, #offStackSaveArea_prevFrame] @ r10<- saveArea->prevFrame 184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount 185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr rPC, [r0, #offStackSaveArea_savedPc] @ rPC<- saveArea->savedPc 18697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION) 187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r9, [r0, #offStackSaveArea_returnAddr] @ r9<- chaining cell ret 18897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 18997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao mov r9, #0 @ disable chaining 19097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r2, [r10, #(offStackSaveArea_method - sizeofStackSaveArea)] 192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ r2<- method we're returning to 193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r2, #0 @ break frame? 19597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION) 196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng beq 1f @ bail to interpreter 19797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 19897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao blxeq lr @ punt to interpreter and compare state 19997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 2006c10a977ec892c26c8e306356491833bbb073d40Ben Cheng ldr r1, .LdvmJitToInterpNoChain @ defined in footer.S 201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rFP, r10 @ publish new FP 202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldrne r10, [r2, #offMethod_clazz] @ r10<- method->clazz 203ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r8, [r8] @ r8<- suspendCount 204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r2, [rGLUE, #offGlue_method]@ glue->method = newSave->method 2066c10a977ec892c26c8e306356491833bbb073d40Ben Cheng ldr r0, [r10, #offClassObject_pDvmDex] @ r0<- method->clazz->pDvmDex 207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rFP, [r3, #offThread_curFrame] @ self->curFrame = fp 208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add rPC, rPC, #6 @ publish new rPC (advance 6 bytes) 2096c10a977ec892c26c8e306356491833bbb073d40Ben Cheng str r0, [rGLUE, #offGlue_methodClassDex] 210ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r8, #0 @ check the suspendCount 211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movne r9, #0 @ clear the chaining cell address 2127a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r9, [r3, #offThread_inJitCodeCache] @ in code cache or not 213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r9, #0 @ chaining cell exists? 214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng blxne r9 @ jump to the chaining cell 2156c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#if defined(EXIT_STATS) 2166c10a977ec892c26c8e306356491833bbb073d40Ben Cheng mov r0, #kCallsiteInterpreted 2176c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif 2186c10a977ec892c26c8e306356491833bbb073d40Ben Cheng mov pc, r1 @ callsite is interpreted 219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng1: 220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng stmia rGLUE, {rPC, rFP} @ SAVE_PC_FP_TO_GLUE() 221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r2, .LdvmMterpStdBail @ defined in footer.S 222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1, #0 @ changeInterp = false 223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, rGLUE @ Expecting rGLUE in r0 224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng blx r2 @ exit the interpreter 225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT 229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT: 230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S */ 231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC 233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * into rPC then jump to dvmJitToInterpNoChain to dispatch the 234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * runtime-resolved callee. 235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite 237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldrh r7, [r0, #offMethod_registersSize] @ r7<- methodToCall->regsSize 238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldrh r2, [r0, #offMethod_outsSize] @ r2<- methodToCall->outsSize 239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r9, [rGLUE, #offGlue_interpStackEnd] @ r9<- interpStackEnd 240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount 241ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add r3, r1, #1 @ Thumb addr is odd 242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r1, rFP) @ r1<- stack save area 243ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sub r1, r1, r7, lsl #2 @ r1<- newFp (old savearea - regsSize) 244ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r10, r1) @ r10<- stack save area 245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sub r10, r10, r2, lsl #2 @ r10<- bottom (newsave - outsSize) 246964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r8, [r8] @ r8<- suspendCount (int) 247ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r10, r9 @ bottom < interpStackEnd? 248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxlt lr @ return to raise stack overflow excep. 249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite 250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r9, [r0, #offMethod_clazz] @ r9<- method->clazz 251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags 252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)] 253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)] 254ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr rPC, [r0, #offMethod_insns] @ rPC<- methodToCall->insns 255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ set up newSaveArea 258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)] 259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)] 260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)] 261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r8, #0 @ suspendCount != 0 262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxne lr @ bail to the interpreter 263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng tst r10, #ACC_NATIVE 26497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION) 265ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bne .LinvokeNative 26697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 26797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao bxne lr @ bail to the interpreter 26897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 269ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 270ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r10, .LdvmJitToInterpNoChain 271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex 272ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r2, [rGLUE, #offGlue_self] @ r2<- glue->self 273ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 274ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ Update "glue" values for the new method 275ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r0, [rGLUE, #offGlue_method] @ glue->method = methodToCall 276ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r3, [rGLUE, #offGlue_methodClassDex] @ glue->methodClassDex = ... 277ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rFP, r1 @ fp = newFp 278ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rFP, [r2, #offThread_curFrame] @ self->curFrame = newFp 279ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 280ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ Start executing the callee 2816c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#if defined(EXIT_STATS) 2826c10a977ec892c26c8e306356491833bbb073d40Ben Cheng mov r0, #kInlineCacheMiss 2836c10a977ec892c26c8e306356491833bbb073d40Ben Cheng#endif 284ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov pc, r10 @ dvmJitToInterpNoChain 285ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 286ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 287ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 288ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN 289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_CHAIN: 290ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_CHAIN.S */ 291ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 292ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * For monomorphic callsite, setup the Dalvik frame and return to the 293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Thumb code through the link register to transfer control to the callee 294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * method through a dedicated chaining cell. 295ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite 29738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ methodToCall is guaranteed to be non-native 29838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng.LinvokeChain: 299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldrh r7, [r0, #offMethod_registersSize] @ r7<- methodToCall->regsSize 300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldrh r2, [r0, #offMethod_outsSize] @ r2<- methodToCall->outsSize 301ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r9, [rGLUE, #offGlue_interpStackEnd] @ r9<- interpStackEnd 302ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount 303ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add r3, r1, #1 @ Thumb addr is odd 304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r1, rFP) @ r1<- stack save area 305ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sub r1, r1, r7, lsl #2 @ r1<- newFp (old savearea - regsSize) 306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r10, r1) @ r10<- stack save area 307ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add r12, lr, #2 @ setup the punt-to-interp address 308ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sub r10, r10, r2, lsl #2 @ r10<- bottom (newsave - outsSize) 309964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r8, [r8] @ r8<- suspendCount (int) 310ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r10, r9 @ bottom < interpStackEnd? 311ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxlt r12 @ return to raise stack overflow excep. 312ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite 313ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r9, [r0, #offMethod_clazz] @ r9<- method->clazz 314ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)] 315ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)] 316ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr rPC, [r0, #offMethod_insns] @ rPC<- methodToCall->insns 317ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 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 334ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 335ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr @ return to the callee-chaining cell 336ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 337ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 338ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 339ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 340ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 34138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng .global dvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN 34238329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN: 34338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_PREDICTED_CHAIN.S */ 34438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng /* 34538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * For polymorphic callsite, check whether the cached class pointer matches 34638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * the current one. If so setup the Dalvik frame and return to the 34738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * Thumb code through the link register to transfer control to the callee 34838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * method through a dedicated chaining cell. 34938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * 35089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee * The predicted chaining cell is declared in ArmLIR.h with the 35138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * following layout: 35238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * 35338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * typedef struct PredictedChainingCell { 35438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * u4 branch; 35538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * const ClassObject *clazz; 35638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * const Method *method; 35738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * u4 counter; 35838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * } PredictedChainingCell; 35938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * 36038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * Upon returning to the callsite: 36138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * - lr : to branch to the chaining cell 36238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * - lr+2: to punt to the interpreter 36338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * - lr+4: to fully resolve the callee and may rechain. 36438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * r3 <- class 36538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * r9 <- counter 36638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng */ 36738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ r0 = this, r1 = returnCell, r2 = predictedChainCell, rPC = dalvikCallsite 36838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r3, [r0, #offObject_clazz] @ r3 <- this->class 36938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r8, [r2, #4] @ r8 <- predictedChainCell->clazz 37038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r0, [r2, #8] @ r0 <- predictedChainCell->method 37138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r9, [r2, #12] @ r9 <- predictedChainCell->counter 37238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng cmp r3, r8 @ predicted class == actual class? 37338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng beq .LinvokeChain @ predicted chain is valid 37438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r7, [r3, #offClassObject_vtable] @ r7 <- this->class->vtable 37538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng sub r1, r9, #1 @ count-- 37638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str r1, [r2, #12] @ write back to PredictedChainingCell->counter 37738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng add lr, lr, #4 @ return to fully-resolve landing pad 37838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng /* 37938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * r1 <- count 38038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * r2 <- &predictedChainCell 38138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * r3 <- this->class 38238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * r4 <- dPC 38338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng * r7 <- this->class->vtable 38438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng */ 38538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng bx lr 38638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 38738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */ 38838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng .balign 4 38938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng .global dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE 39038329f5678fd7a4879528b02a0ab60322d38a897Ben ChengdvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE: 39138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* File: armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S */ 39238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite 39338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldrh r7, [r0, #offMethod_registersSize] @ r7<- methodToCall->regsSize 39438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r9, [rGLUE, #offGlue_interpStackEnd] @ r9<- interpStackEnd 39538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount 39638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng add r3, r1, #1 @ Thumb addr is odd 39738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng SAVEAREA_FROM_FP(r1, rFP) @ r1<- stack save area 39838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng sub r1, r1, r7, lsl #2 @ r1<- newFp (old savearea - regsSize) 39938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng SAVEAREA_FROM_FP(r10, r1) @ r10<- stack save area 40038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r8, [r8] @ r3<- suspendCount (int) 40138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng cmp r10, r9 @ bottom < interpStackEnd? 40238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng bxlt lr @ return to raise stack overflow excep. 40338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite 40438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)] 40538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)] 40638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr rPC, [r0, #offMethod_insns] @ rPC<- methodToCall->insns 40738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 40838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 40938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ set up newSaveArea 41038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)] 41138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)] 41238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 41338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)] 41438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng cmp r8, #0 @ suspendCount != 0 41538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc 41697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION) 41738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng bxne lr @ bail to the interpreter 41897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else 41997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao bx lr @ bail to interpreter unconditionally 42097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 42138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 42238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ go ahead and transfer control to the native code 423d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->... 4247a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r2, #0 42538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str r1, [r3, #offThread_curFrame] @ self->curFrame = newFp 4267a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r2, [r3, #offThread_inJitCodeCache] @ not in the jit code cache 427d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)] 428d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden @ newFp->localRefCookie=top 42938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng mov r9, r3 @ r9<- glue->self (preserve) 43038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng SAVEAREA_FROM_FP(r10, r1) @ r10<- new stack save area 43138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 43238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng mov r2, r0 @ r2<- methodToCall 43338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng mov r0, r1 @ r0<- newFP 43438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng add r1, rGLUE, #offGlue_retval @ r1<- &retval 43538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 43638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng blx r8 @ off to the native code 43738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 43838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ native return; r9=self, r10=newSaveArea 43938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ equivalent to dvmPopJniLocals 44038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret 441d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top 44238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng ldr r1, [r9, #offThread_exception] @ check for exception 44338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng str rFP, [r9, #offThread_curFrame] @ self->curFrame = fp 44438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng cmp r1, #0 @ null? 445d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top 446909b418219f63c0d0b2bde8a0835dbf27d5061b8Bill Buzbee ldr r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)] 44760c24f436d603c564d5351a6f81821f12635733cBen Cheng 44860c24f436d603c564d5351a6f81821f12635733cBen Cheng @ r0 = dalvikCallsitePC 44960c24f436d603c564d5351a6f81821f12635733cBen Cheng bne .LhandleException @ no, handle exception 45060c24f436d603c564d5351a6f81821f12635733cBen Cheng 4517a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r2, [r9, #offThread_inJitCodeCache] @ set the mode properly 45260c24f436d603c564d5351a6f81821f12635733cBen Cheng cmp r2, #0 @ return chaining cell still exists? 45360c24f436d603c564d5351a6f81821f12635733cBen Cheng bxne r2 @ yes - go ahead 45460c24f436d603c564d5351a6f81821f12635733cBen Cheng 45560c24f436d603c564d5351a6f81821f12635733cBen Cheng @ continue executing the next instruction through the interpreter 45660c24f436d603c564d5351a6f81821f12635733cBen Cheng ldr r1, .LdvmJitToInterpNoChain @ defined in footer.S 45760c24f436d603c564d5351a6f81821f12635733cBen Cheng add rPC, r0, #6 @ reconstruct new rPC (advance 6 bytes) 4587a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#if defined(EXIT_STATS) 4597a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r0, #kCallsiteInterpreted 4607a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif 46160c24f436d603c564d5351a6f81821f12635733cBen Cheng mov pc, r1 46260c24f436d603c564d5351a6f81821f12635733cBen Cheng 46360c24f436d603c564d5351a6f81821f12635733cBen Cheng 46438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 46538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng 46638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng/* ------------------------------ */ 46738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng .balign 4 468ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_CMPG_DOUBLE 469ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_DOUBLE: 470ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_DOUBLE.S */ 471ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */ 472ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 4731465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * For the JIT: incoming arguments in r0-r1, r2-r3 474ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * result in r0 475ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 476ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Compare two floating-point values. Puts 0, 1, or -1 into the 477ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * destination register based on the results of the comparison. 478ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 479ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 480ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * on what value we'd like to return when one of the operands is NaN. 481ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 482ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See OP_CMPL_FLOAT for an explanation. 483ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 484ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * For: cmpl-double, cmpg-double 485ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 486ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* op vAA, vBB, vCC */ 4871465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee push {r0-r3} @ save operands 4881465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r11, lr @ save return address 489ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cdcmple" @ PIC way of "bl __aeabi_cdcmple" 490ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bhi .LTEMPLATE_CMPG_DOUBLE_gt_or_nan @ C set and Z clear, disambiguate 491ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mvncc r0, #0 @ (less than) r1<- -1 492ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng moveq r0, #0 @ (equal) r1<- 0, trumps less than 4931465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee add sp, #16 @ drop unused operands 4941465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 495ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 496ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ Test for NaN with a second comparison. EABI forbids testing bit 497ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ patterns, and we can't represent 0x7fc00000 in immediate form, so 498ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ make the library call. 499ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_DOUBLE_gt_or_nan: 5001465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee pop {r2-r3} @ restore operands in reverse order 5011465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee pop {r0-r1} @ restore operands in reverse order 502ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cdcmple" @ r0<- Z set if eq, C clear if < 503ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movcc r0, #1 @ (greater than) r1<- 1 5041465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bxcc r11 505ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, #1 @ r1<- 1 or -1 for NaN 5061465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 507ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 508ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 509ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 510ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 511ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 512ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_CMPL_DOUBLE 513ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_DOUBLE: 514ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_DOUBLE.S */ 515ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 5161465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * For the JIT: incoming arguments in r0-r1, r2-r3 517ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * result in r0 518ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 519ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Compare two floating-point values. Puts 0, 1, or -1 into the 520ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * destination register based on the results of the comparison. 521ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 522ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 523ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * on what value we'd like to return when one of the operands is NaN. 524ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 525ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See OP_CMPL_FLOAT for an explanation. 526ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 527ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * For: cmpl-double, cmpg-double 528ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 529ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* op vAA, vBB, vCC */ 5301465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee push {r0-r3} @ save operands 5311465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r11, lr @ save return address 532ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cdcmple" @ PIC way of "bl __aeabi_cdcmple" 533ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bhi .LTEMPLATE_CMPL_DOUBLE_gt_or_nan @ C set and Z clear, disambiguate 534ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mvncc r0, #0 @ (less than) r1<- -1 535ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng moveq r0, #0 @ (equal) r1<- 0, trumps less than 5361465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee add sp, #16 @ drop unused operands 5371465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 538ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 539ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ Test for NaN with a second comparison. EABI forbids testing bit 540ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ patterns, and we can't represent 0x7fc00000 in immediate form, so 541ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ make the library call. 542ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_DOUBLE_gt_or_nan: 5431465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee pop {r2-r3} @ restore operands in reverse order 5441465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee pop {r0-r1} @ restore operands in reverse order 545ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cdcmple" @ r0<- Z set if eq, C clear if < 546ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movcc r0, #1 @ (greater than) r1<- 1 5471465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bxcc r11 548ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mvn r0, #0 @ r1<- 1 or -1 for NaN 5491465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 550ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 551ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 552ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 553ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 554ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_CMPG_FLOAT 555ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPG_FLOAT: 556ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPG_FLOAT.S */ 557ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */ 558ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 5591465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * For the JIT: incoming arguments in r0-r1, r2-r3 560ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * result in r0 561ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 562ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Compare two floating-point values. Puts 0, 1, or -1 into the 563ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * destination register based on the results of the comparison. 564ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 565ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 566ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * on what value we'd like to return when one of the operands is NaN. 567ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 568ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The operation we're implementing is: 569ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if (x == y) 570ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return 0; 571ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * else if (x < y) 572ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return -1; 573ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * else if (x > y) 574ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return 1; 575ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * else 576ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return {-1,1}; // one or both operands was NaN 577ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 578ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The straightforward implementation requires 3 calls to functions 579ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * that return a result in r0. We can do it with two calls if our 580ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * EABI library supports __aeabi_cfcmple (only one if we want to check 581ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for NaN directly): 582ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * check x <= y 583ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if <, return -1 584ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if ==, return 0 585ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * check y <= x 586ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if <, return 1 587ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return {-1,1} 588ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 589ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for: cmpl-float, cmpg-float 590ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 591ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* op vAA, vBB, vCC */ 592ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r9, r0 @ Save copies - we may need to redo 593ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r10, r1 5941465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r11, lr @ save return address 595ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cfcmple" @ cmp <=: C clear if <, Z set if eq 596ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bhi .LTEMPLATE_CMPG_FLOAT_gt_or_nan @ C set and Z clear, disambiguate 597ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mvncc r0, #0 @ (less than) r0<- -1 598ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng moveq r0, #0 @ (equal) r0<- 0, trumps less than 5991465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 600ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ Test for NaN with a second comparison. EABI forbids testing bit 601ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ patterns, and we can't represent 0x7fc00000 in immediate form, so 602ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ make the library call. 603ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPG_FLOAT_gt_or_nan: 6041465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r0, r10 @ restore in reverse order 6051465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r1, r9 606ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cfcmple" @ r0<- Z set if eq, C clear if < 607ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movcc r0, #1 @ (greater than) r1<- 1 6081465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bxcc r11 609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, #1 @ r1<- 1 or -1 for NaN 6101465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 611ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 612ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 613ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 614ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 615ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 616ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 617ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_CMPL_FLOAT 618ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_CMPL_FLOAT: 619ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_CMPL_FLOAT.S */ 620ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 6211465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * For the JIT: incoming arguments in r0-r1, r2-r3 622ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * result in r0 623ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 624ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Compare two floating-point values. Puts 0, 1, or -1 into the 625ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * destination register based on the results of the comparison. 626ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 627ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Provide a "naninst" instruction that puts 1 or -1 into r1 depending 628ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * on what value we'd like to return when one of the operands is NaN. 629ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 630ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The operation we're implementing is: 631ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if (x == y) 632ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return 0; 633ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * else if (x < y) 634ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return -1; 635ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * else if (x > y) 636ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return 1; 637ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * else 638ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return {-1,1}; // one or both operands was NaN 639ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 640ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The straightforward implementation requires 3 calls to functions 641ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * that return a result in r0. We can do it with two calls if our 642ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * EABI library supports __aeabi_cfcmple (only one if we want to check 643ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for NaN directly): 644ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * check x <= y 645ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if <, return -1 646ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if ==, return 0 647ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * check y <= x 648ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * if <, return 1 649ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * return {-1,1} 650ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 651ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for: cmpl-float, cmpg-float 652ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 653ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* op vAA, vBB, vCC */ 654ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r9, r0 @ Save copies - we may need to redo 655ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r10, r1 6561465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r11, lr @ save return address 657ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cfcmple" @ cmp <=: C clear if <, Z set if eq 658ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bhi .LTEMPLATE_CMPL_FLOAT_gt_or_nan @ C set and Z clear, disambiguate 659ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mvncc r0, #0 @ (less than) r0<- -1 660ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng moveq r0, #0 @ (equal) r0<- 0, trumps less than 6611465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 662ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ Test for NaN with a second comparison. EABI forbids testing bit 663ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ patterns, and we can't represent 0x7fc00000 in immediate form, so 664ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ make the library call. 665ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LTEMPLATE_CMPL_FLOAT_gt_or_nan: 6661465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r0, r10 @ restore in reverse order 6671465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee mov r1, r9 668ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR ".L__aeabi_cfcmple" @ r0<- Z set if eq, C clear if < 669ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movcc r0, #1 @ (greater than) r1<- 1 6701465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bxcc r11 671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mvn r0, #0 @ r1<- 1 or -1 for NaN 6721465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx r11 673ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 675ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 676ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 677ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 678ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_MUL_LONG 679ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_MUL_LONG: 680ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_MUL_LONG.S */ 681ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 682ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Signed 64-bit integer multiply. 683ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 684ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * For JIT: op1 in r0/r1, op2 in r2/r3, return in r0/r1 685ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 686ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Consider WXxYZ (r1r0 x r3r2) with a long multiply: 687ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WX 688ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * x YZ 689ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * -------- 690ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ZW ZX 691ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * YW YX 692ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 693ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The low word of the result holds ZX, the high word holds 694ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because 695ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * it doesn't fit in the low 64 bits. 696ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 697ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unlike most ARM math operations, multiply instructions have 698ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * restrictions on using the same register more than once (Rd and Rm 699ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * cannot be the same). 700ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 701ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* mul-long vAA, vBB, vCC */ 702ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mul ip, r2, r1 @ ip<- ZxW 703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng umull r9, r10, r2, r0 @ r9/r10 <- ZxX 704ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 705ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX)) 706ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0,r9 707ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1,r10 708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr 709ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 710ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 712ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_SHL_LONG 713ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHL_LONG: 714ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHL_LONG.S */ 715ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 716ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Long integer shift. This is different from the generic 32/64-bit 717ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * binary operations because vAA/vBB are 64-bit but vCC (the shift 718ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 719ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 6 bits. 720ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 721ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* shl-long vAA, vBB, vCC */ 722ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng and r2, r2, #63 @ r2<- r2 & 0x3f 723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1, r1, asl r2 @ r1<- r1 << r2 724ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng rsb r3, r2, #32 @ r3<- 32 - r2 725ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2)) 726ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng subs ip, r2, #32 @ ip<- r2 - 32 727ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32) 728ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, r0, asl r2 @ r0<- r0 << r2 729ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr 730ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 731ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 732ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 733ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_SHR_LONG 734ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_SHR_LONG: 735ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_SHR_LONG.S */ 736ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 737ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Long integer shift. This is different from the generic 32/64-bit 738ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * binary operations because vAA/vBB are 64-bit but vCC (the shift 739ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 740ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 6 bits. 741ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 742ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* shr-long vAA, vBB, vCC */ 743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng and r2, r2, #63 @ r0<- r0 & 0x3f 744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, r0, lsr r2 @ r0<- r2 >> r2 745ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng rsb r3, r2, #32 @ r3<- 32 - r2 746ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 747ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng subs ip, r2, #32 @ ip<- r2 - 32 748ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32) 749ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1, r1, asr r2 @ r1<- r1 >> r2 750ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr 751ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 752ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 753ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* ------------------------------ */ 754ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .balign 4 755ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dvmCompiler_TEMPLATE_USHR_LONG 756ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmCompiler_TEMPLATE_USHR_LONG: 757ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/TEMPLATE_USHR_LONG.S */ 758ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 759ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Long integer shift. This is different from the generic 32/64-bit 760ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * binary operations because vAA/vBB are 64-bit but vCC (the shift 761ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 762ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 6 bits. 763ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 764ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* ushr-long vAA, vBB, vCC */ 765ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng and r2, r2, #63 @ r0<- r0 & 0x3f 766ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, r0, lsr r2 @ r0<- r2 >> r2 767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng rsb r3, r2, #32 @ r3<- 32 - r2 768ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2)) 769ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng subs ip, r2, #32 @ ip<- r2 - 32 770ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32) 771ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r1, r1, lsr r2 @ r1<- r1 >>> r2 772ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr 773ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 774ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 7754f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* ------------------------------ */ 7764f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng .balign 4 7774f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng .global dvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON 7784f48917c0741e4d9b15ca7c45956aea05fea103fBen ChengdvmCompiler_TEMPLATE_THROW_EXCEPTION_COMMON: 7794f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* File: armv5te/TEMPLATE_THROW_EXCEPTION_COMMON.S */ 7804f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng /* 7814f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * Throw an exception from JIT'ed code. 7824f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry: 7834f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0 Dalvik PC that raises the exception 7844f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */ 7854f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng b .LhandleException 7864f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng 7871465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* ------------------------------ */ 7881465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee .balign 4 7891465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee .global dvmCompiler_TEMPLATE_SAVE_STATE 7901465db5ee2d3c4c4dcc8e017a294172e858765cbBill BuzbeedvmCompiler_TEMPLATE_SAVE_STATE: 7911465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* File: armv5te/TEMPLATE_SAVE_STATE.S */ 7921465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee /* 7931465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * This handler performs a register save for selfVerification mode. 7941465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * On entry: 7951465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * Top of stack + 4: r7 value to save 7961465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * Top of stack + 0: r0 value to save 7971465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * r0 - offset from rGLUE to the beginning of the heapArgSpace record 7981465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * r7 - the value of regMap 7991465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * 8001465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * The handler must save regMap, r0-r12 and then return with r0-r12 8011465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * with their original values (note that this means r0 and r7 must take 8021465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * the values on the stack - not the ones in those registers on entry. 8031465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * Finally, the two registers previously pushed must be popped. 8041465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee */ 8051465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee add r0, r0, rGLUE @ pointer to heapArgSpace 8061465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee stmia r0!, {r7} @ save regMap 8071465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee ldr r7, [r13, #0] @ recover r0 value 8081465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee stmia r0!, {r7} @ save r0 8091465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee ldr r7, [r13, #4] @ recover r7 value 8101465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee stmia r0!, {r1-r12} 8111465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee pop {r0, r7} @ recover r0, r7 8121465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx lr 8131465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee 8141465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* ------------------------------ */ 8151465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee .balign 4 8161465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee .global dvmCompiler_TEMPLATE_RESTORE_STATE 8171465db5ee2d3c4c4dcc8e017a294172e858765cbBill BuzbeedvmCompiler_TEMPLATE_RESTORE_STATE: 8181465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee/* File: armv5te/TEMPLATE_RESTORE_STATE.S */ 8191465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee /* 8201465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * This handler restores state following a selfVerification memory access. 8211465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * On entry: 8221465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee * r0 - offset from rGLUE to the 1st element of the coreRegs save array. 8231465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee */ 8241465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee add r0, r0, rGLUE @ pointer to heapArgSpace.coreRegs[0] 8251465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee ldmia r0, {r0-r12} 8261465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee bx lr 8271465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee 828fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */ 829fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee .balign 4 830fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee .global dvmCompiler_TEMPLATE_STRING_COMPARETO 831fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_COMPARETO: 832fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_COMPARETO.S */ 833fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* 834fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * String's compareTo. 835fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 836fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * Requires r0/r1 to have been previously checked for null. Will 837fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * return negative if this's string is < comp, 0 if they are the 838fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * same and positive if >. 839fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 840fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * IMPORTANT NOTE: 841fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 842fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * This code relies on hard-coded offsets for string objects, and must be 843fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * kept in sync with definitions in UtfString.h. See asm-constants.h 844fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 845fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * On entry: 846fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r0: this object pointer 847fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r1: comp object pointer 848fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 849fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee */ 850fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 851fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee mov r2, r0 @ this to r2, opening up r0 for return value 852fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r0, r2, r1 @ Same? 853fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bxeq lr 854fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 855fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r4, [r2, #STRING_FIELDOFF_OFFSET] 856fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r9, [r1, #STRING_FIELDOFF_OFFSET] 857fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r7, [r2, #STRING_FIELDOFF_COUNT] 858fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r10, [r1, #STRING_FIELDOFF_COUNT] 859fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r2, [r2, #STRING_FIELDOFF_VALUE] 860fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r1, [r1, #STRING_FIELDOFF_VALUE] 861fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 862fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* 863fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * At this point, we have: 864fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * value: r2/r1 865fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * offset: r4/r9 866fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * count: r7/r10 867fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * We're going to compute 868fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r11 <- countDiff 869fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r10 <- minCount 870fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee */ 871fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r11, r7, r10 872fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee movls r10, r7 873fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 874fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* Now, build pointers to the string data */ 875fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee add r2, r2, r4, lsl #1 876fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee add r1, r1, r9, lsl #1 877fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* 878fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * Note: data pointers point to previous element so we can use pre-index 879fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * mode with base writeback. 880fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee */ 881fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee add r2, #16-2 @ offset to contents[-1] 882fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee add r1, #16-2 @ offset to contents[-1] 883fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 884fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* 885fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * At this point we have: 886fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r2: *this string data 887fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r1: *comp string data 888fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r10: iteration count for comparison 889fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r11: value to return if the first part of the string is equal 890fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r0: reserved for result 891fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r3, r4, r7, r8, r9, r12 available for loading string data 892fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee */ 893fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 8944c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee subs r10, #2 8954c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee blt do_remainder2 8964c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee 8974c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee /* 8984c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee * Unroll the first two checks so we can quickly catch early mismatch 8994c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee * on long strings (but preserve incoming alignment) 9004c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee */ 9014c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee 9024c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee ldrh r3, [r2, #2]! 9034c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee ldrh r4, [r1, #2]! 9044c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee ldrh r7, [r2, #2]! 9054c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee ldrh r8, [r1, #2]! 9064c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee subs r0, r3, r4 9074c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee subeqs r0, r7, r8 9084c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee bxne lr 9094c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee cmp r10, #28 9104c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee bgt do_memcmp16 9114c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee subs r10, #3 912fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee blt do_remainder 9134c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee 914fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_triple: 915fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r3, [r2, #2]! 916fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r4, [r1, #2]! 917fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r7, [r2, #2]! 918fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r8, [r1, #2]! 919fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r9, [r2, #2]! 920fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r12,[r1, #2]! 921fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r0, r3, r4 922fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subeqs r0, r7, r8 923fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subeqs r0, r9, r12 924fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bxne lr 925fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r10, #3 9265965d47b624798343b6a53afd384f2cf88d091deBill Buzbee bge loopback_triple 927fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 928fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeedo_remainder: 9295965d47b624798343b6a53afd384f2cf88d091deBill Buzbee adds r10, #3 930fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee beq returnDiff 931fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 932fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeeloopback_single: 933fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r3, [r2, #2]! 934fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r4, [r1, #2]! 935fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r0, r3, r4 936fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bxne lr 937fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r10, #1 938fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bne loopback_single 939fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 940fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeereturnDiff: 941fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee mov r0, r11 942fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bx lr 943fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 9444c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_remainder2: 9454c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee adds r10, #2 9464c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee bne loopback_single 9474c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee mov r0, r11 9484c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee bx lr 9494c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee 9504c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee /* Long string case */ 9514c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbeedo_memcmp16: 9524c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee mov r4, lr 9534c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee ldr lr, .Lmemcmp16 9544c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee mov r7, r11 9554c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee add r0, r2, #2 9564c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee add r1, r1, #2 9574c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee mov r2, r10 9584c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee blx lr 9594c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee cmp r0, #0 9604c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee bxne r4 9614c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee mov r0, r7 9624c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee bx r4 9634c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee 9644c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee.Lmemcmp16: 9654c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee .word __memcmp16 9664c0dedfd9006daee4f6d96482cc6ac94a1797880Bill Buzbee 967fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 968fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* ------------------------------ */ 969fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee .balign 4 970fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee .global dvmCompiler_TEMPLATE_STRING_INDEXOF 971fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill BuzbeedvmCompiler_TEMPLATE_STRING_INDEXOF: 972fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee/* File: armv5te/TEMPLATE_STRING_INDEXOF.S */ 973fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* 974fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * String's indexOf. 975fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 976fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * Requires r0 to have been previously checked for null. Will 977fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * return index of match of r1 in r0. 978fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 979fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * IMPORTANT NOTE: 980fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 981fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * This code relies on hard-coded offsets for string objects, and must be 982fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * kept in sync wth definitions in UtfString.h See asm-constants.h 983fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * 984fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * On entry: 985fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r0: string object pointer 986fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r1: char to match 987fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * r2: Starting offset in string data 988fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee */ 989fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 990fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r7, [r0, #STRING_FIELDOFF_OFFSET] 991fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r8, [r0, #STRING_FIELDOFF_COUNT] 992fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldr r0, [r0, #STRING_FIELDOFF_VALUE] 993fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 994fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* 995fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * At this point, we have: 99649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r0: object pointer 99749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r1: char to match 99849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r2: starting offset 99949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r7: offset 100049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r8: string length 1001fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee */ 1002fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 100349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee /* Build pointer to start of string data */ 100449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee add r0, #16 100549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee add r0, r0, r7, lsl #1 100649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 100749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee /* Save a copy of starting data in r7 */ 100849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee mov r7, r0 100949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 1010fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* Clamp start to [0..count] */ 1011fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee cmp r2, #0 1012fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee movlt r2, #0 1013fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee cmp r2, r8 101449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee movgt r2, r8 1015fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 101649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee /* Build pointer to start of data to compare and pre-bias */ 1017fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee add r0, r0, r2, lsl #1 101849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee sub r0, #2 101949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 102049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee /* Compute iteration count */ 102149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee sub r8, r2 1022fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 1023fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee /* 1024fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee * At this point we have: 102549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r0: start of data to test 102649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r1: chat to compare 102749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r8: iteration count 102849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r7: original start of string 102949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * r3, r4, r9, r10, r11, r12 available for loading string data 1030fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee */ 1031fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 1032ab875c79c56eacc510b09710d38a9b20f7337486Bill Buzbee subs r8, #4 103349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee blt indexof_remainder 1034fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 103549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop4: 1036fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r3, [r0, #2]! 1037fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r4, [r0, #2]! 103849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee ldrh r10, [r0, #2]! 103949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee ldrh r11, [r0, #2]! 1040fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee cmp r3, r1 1041fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee beq match_0 1042fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee cmp r4, r1 1043fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee beq match_1 104449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee cmp r10, r1 1045fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee beq match_2 104649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee cmp r11, r1 1047fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee beq match_3 1048fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r8, #4 104949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee bge indexof_loop4 1050fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 105149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_remainder: 105249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee adds r8, #4 105349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee beq indexof_nomatch 1054fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 105549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_loop1: 1056fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee ldrh r3, [r0, #2]! 1057fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee cmp r3, r1 1058fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee beq match_3 1059fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee subs r8, #1 106049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee bne indexof_loop1 1061fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 106249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeeindexof_nomatch: 1063fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee mov r0, #-1 1064fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bx lr 1065fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 1066fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_0: 1067fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee sub r0, #6 106849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee sub r0, r7 106949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee asr r0, r0, #1 1070fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bx lr 1071fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_1: 1072fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee sub r0, #4 107349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee sub r0, r7 107449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee asr r0, r0, #1 1075fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bx lr 1076fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_2: 1077fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee sub r0, #2 107849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee sub r0, r7 107949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee asr r0, r0, #1 1080fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bx lr 1081fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbeematch_3: 108249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee sub r0, r7 108349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee asr r0, r0, #1 1084fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee bx lr 1085fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 1086fd023aaec5f2b0df61d1702ea2f29a70abe90158Bill Buzbee 10879a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* ------------------------------ */ 10889a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee .balign 4 10899a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee .global dvmCompiler_TEMPLATE_INTERPRET 10909a8c75adb2abf551d06dbf757bff558c1feded08Bill BuzbeedvmCompiler_TEMPLATE_INTERPRET: 10919a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee/* File: armv5te/TEMPLATE_INTERPRET.S */ 10929a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee /* 10939a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * This handler transfers control to the interpeter without performing 10949a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * any lookups. It may be called either as part of a normal chaining 10959a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * operation, or from the transition code in header.S. We distinquish 10969a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * the two cases by looking at the link register. If called from a 10979a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * translation chain, it will point to the chaining Dalvik PC + 1. 10989a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * On entry: 10999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * lr - if NULL: 11009a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * r1 - the Dalvik PC to begin interpretation. 11019a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * else 11029a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * [lr, #-1] contains Dalvik PC to begin interpretation 11039a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * rGLUE - pointer to interpState 11049a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee * rFP - Dalvik frame pointer 11059a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee */ 11069a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee cmp lr, #0 11079a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldrne r1,[lr, #-1] 11089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee ldr r2, .LinterpPunt 11099a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee mov r0, r1 @ set Dalvik PC 11109a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee bx r2 11119a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee @ doesn't return 11129a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee 11139a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee.LinterpPunt: 11149a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee .word dvmJitToInterpPunt 11159a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee 1116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .size dvmCompilerTemplateStart, .-dvmCompilerTemplateStart 1117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* File: armv5te/footer.S */ 1118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 1119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * =========================================================================== 1120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Common subroutines and data 1121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * =========================================================================== 1122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 1123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .text 1125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .align 2 1126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LinvokeNative: 1127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ Prep for the native call 1128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ r1 = newFP, r0 = methodToCall 1129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 11307a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r2, #0 1131d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->... 11327a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r2, [r3, #offThread_inJitCodeCache] @ not in jit code cache 1133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r1, [r3, #offThread_curFrame] @ self->curFrame = newFp 1134d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)] 1135d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden @ newFp->localRefCookie=top 1136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r9, r3 @ r9<- glue->self (preserve) 1137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r10, r1) @ r10<- new stack save area 1138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r2, r0 @ r2<- methodToCall 1140ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov r0, r1 @ r0<- newFP 1141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add r1, rGLUE, #offGlue_retval @ r1<- &retval 1142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LDR_PC_LR "[r2, #offMethod_nativeFunc]" 1144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1145964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee @ Refresh Jit's on/off status 1146964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r3, [rGLUE, #offGlue_ppJitProfTable] 1147964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee 1148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ native return; r9=self, r10=newSaveArea 1149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ equivalent to dvmPopJniLocals 1150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret 1151d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden ldr r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top 1152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r1, [r9, #offThread_exception] @ check for exception 1153964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee ldr r3, [r3] @ r1 <- pointer to Jit profile table 1154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rFP, [r9, #offThread_curFrame] @ self->curFrame = fp 1155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r1, #0 @ null? 1156d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden str r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top 11574f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng ldr r0, [r10, #offStackSaveArea_savedPc] @ reload rPC 1158964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee str r3, [rGLUE, #offGlue_pJitProfTable] @ cache current JitProfTable 115960c24f436d603c564d5351a6f81821f12635733cBen Cheng 116060c24f436d603c564d5351a6f81821f12635733cBen Cheng @ r0 = dalvikCallsitePC 116160c24f436d603c564d5351a6f81821f12635733cBen Cheng bne .LhandleException @ no, handle exception 116260c24f436d603c564d5351a6f81821f12635733cBen Cheng 11637a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r2, [r9, #offThread_inJitCodeCache] @ set the new mode 116460c24f436d603c564d5351a6f81821f12635733cBen Cheng cmp r2, #0 @ return chaining cell still exists? 116560c24f436d603c564d5351a6f81821f12635733cBen Cheng bxne r2 @ yes - go ahead 116660c24f436d603c564d5351a6f81821f12635733cBen Cheng 116760c24f436d603c564d5351a6f81821f12635733cBen Cheng @ continue executing the next instruction through the interpreter 116860c24f436d603c564d5351a6f81821f12635733cBen Cheng ldr r1, .LdvmJitToInterpNoChain @ defined in footer.S 116960c24f436d603c564d5351a6f81821f12635733cBen Cheng add rPC, r0, #6 @ reconstruct new rPC (advance 6 bytes) 11707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#if defined(EXIT_STATS) 11717a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r0, #kCallsiteInterpreted 11727a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif 117360c24f436d603c564d5351a6f81821f12635733cBen Cheng mov pc, r1 1174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 11754f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/* 11764f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry: 11774f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0 Faulting Dalvik PC 11784f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */ 1179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LhandleException: 11807a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng ldr r3, [rGLUE, #offGlue_self] @ r3<- glue->self 11817a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng mov r2, #0 11827a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng str r2, [r3, #offThread_inJitCodeCache] @ in interpreter land 11834f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng ldr r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func 1184cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng ldr rIBASE, .LdvmAsmInstructionStart @ same as above 11854f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng mov rPC, r0 @ reload the faulting Dalvik address 11864f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng mov pc, r1 @ branch to dvmMterpCommonExceptionThrown 1187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .align 2 1189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmAsmInstructionStart: 1190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .word dvmAsmInstructionStart 1191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmJitToInterpNoChain: 1192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .word dvmJitToInterpNoChain 1193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmMterpStdBail: 1194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .word dvmMterpStdBail 1195cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng.LdvmMterpCommonExceptionThrown: 1196cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng .word dvmMterpCommonExceptionThrown 1197ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cdcmple: 1198ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .word __aeabi_cdcmple 1199ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cfcmple: 1200ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .word __aeabi_cfcmple 1201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng .global dmvCompilerTemplateEnd 1203ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdmvCompilerTemplateEnd: 1204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /* WITH_JIT */ 1206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1207