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