1%default { "chaintgt" : ".LinvokeChain" } 2 /* 3 * For monomorphic callsite, setup the Dalvik frame and return to the 4 * Thumb code through the link register to transfer control to the callee 5 * method through a dedicated chaining cell. 6 */ 7 @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize 8 @ rPC = dalvikCallsite, r7 = methodToCall->registersSize 9 @ methodToCall is guaranteed to be non-native 10$chaintgt: 11 ldr r9, [rSELF, #offThread_interpStackEnd] @ r9<- interpStackEnd 12 ldrb r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags 13 add r3, r1, #1 @ Thumb addr is odd 14 SAVEAREA_FROM_FP(r1, rFP) @ r1<- stack save area 15 sub r1, r1, r7, lsl #2 @ r1<- newFp (old savearea - regsSize) 16 SAVEAREA_FROM_FP(r10, r1) @ r10<- stack save area 17 add r12, lr, #2 @ setup the punt-to-interp address 18 sub r10, r10, r2, lsl #2 @ r10<- bottom (newsave - outsSize) 19 cmp r10, r9 @ bottom < interpStackEnd? 20 bxlo r12 @ return to raise stack overflow excep. 21 @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite 22 ldr r9, [r0, #offMethod_clazz] @ r9<- method->clazz 23 str rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)] 24 str rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)] 25 26 @ set up newSaveArea 27 str rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)] 28 str r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)] 29 str r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)] 30 cmp r8, #0 @ breakFlags != 0 31 bxne r12 @ bail to the interpreter 32 33 ldr r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex 34 35 @ Update "thread" values for the new method 36 str r0, [rSELF, #offThread_method] @ self->method = methodToCall 37 str r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ... 38 mov rFP, r1 @ fp = newFp 39 str rFP, [rSELF, #offThread_curFrame] @ curFrame = newFp 40#if defined(TEMPLATE_INLINE_PROFILING) 41 stmfd sp!, {r0-r2,lr} @ preserve clobbered live registers 42 mov r1, r6 43 @ r0=methodToCall, r1=rSELF 44 mov lr, pc 45 ldr pc, .LdvmFastMethodTraceEnter 46 ldmfd sp!, {r0-r2,lr} @ restore registers 47#endif 48 49 bx lr @ return to the callee-chaining cell 50