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