118fba346582c08d81aa96d9508c0e935bad5f36fbuzbee%default { "chaintgt" : ".LinvokeChain" } 2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* 3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * For monomorphic callsite, setup the Dalvik frame and return to the 4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Thumb code through the link register to transfer control to the callee 5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * method through a dedicated chaining cell. 6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 7c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng @ r0 = methodToCall, r1 = returnCell, r2 = methodToCall->outsSize 8c8293e7dfe856ca95e27aef1ac2e64d750d60662Ben Cheng @ rPC = dalvikCallsite, r7 = methodToCall->registersSize 938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng @ methodToCall is guaranteed to be non-native 1018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee$chaintgt: 119f601a917c8878204482c37aec7005054b6776fabuzbee ldr r9, [rSELF, #offThread_interpStackEnd] @ r9<- interpStackEnd 129a3147c7412f4794434b4c2604aa2ba784867774buzbee ldrb r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags 13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add r3, r1, #1 @ Thumb addr is odd 14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r1, rFP) @ r1<- stack save area 15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sub r1, r1, r7, lsl #2 @ r1<- newFp (old savearea - regsSize) 16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng SAVEAREA_FROM_FP(r10, r1) @ r10<- stack save area 17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng add r12, lr, #2 @ setup the punt-to-interp address 18ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sub r10, r10, r2, lsl #2 @ r10<- bottom (newsave - outsSize) 19ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cmp r10, r9 @ bottom < interpStackEnd? 20a62475ecfcc80c58add8f153c9605762dafb8227Ben Cheng bxlo r12 @ return to raise stack overflow excep. 21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite 22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r9, [r0, #offMethod_clazz] @ r9<- method->clazz 23ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)] 24ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)] 25ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 26ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng @ set up newSaveArea 27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)] 28ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)] 29ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng str r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)] 309a3147c7412f4794434b4c2604aa2ba784867774buzbee cmp r8, #0 @ breakFlags != 0 31ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bxne r12 @ bail to the interpreter 32ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 33ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ldr r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex 34ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 359f601a917c8878204482c37aec7005054b6776fabuzbee @ Update "thread" values for the new method 369f601a917c8878204482c37aec7005054b6776fabuzbee str r0, [rSELF, #offThread_method] @ self->method = methodToCall 379f601a917c8878204482c37aec7005054b6776fabuzbee str r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ... 38ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng mov rFP, r1 @ fp = newFp 3930bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee str rFP, [rSELF, #offThread_curFrame] @ curFrame = newFp 4018fba346582c08d81aa96d9508c0e935bad5f36fbuzbee#if defined(TEMPLATE_INLINE_PROFILING) 415cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng stmfd sp!, {r0-r2,lr} @ preserve clobbered live registers 425cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng mov r1, r6 439f601a917c8878204482c37aec7005054b6776fabuzbee @ r0=methodToCall, r1=rSELF 448b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher ldr ip, .LdvmFastMethodTraceEnter 458b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher blx ip 465cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng ldmfd sp!, {r0-r2,lr} @ restore registers 475cc61d70ec727aa22f58463bf7940cc717cf3eb1Ben Cheng#endif 48ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 49ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bx lr @ return to the callee-chaining cell 50