TEMPLATE_INVOKE_METHOD_NO_OPT.S revision 8b095215a4d5bde723819087f3455bdcc250a78f
1    /*
2     * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC
3     * into rPC then jump to dvmJitToInterpNoChain to dispatch the
4     * runtime-resolved callee.
5     */
6    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
7    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
8    ldrh    r2, [r0, #offMethod_outsSize]  @ r2<- methodToCall->outsSize
9    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
10    ldrb    r8, [rSELF, #offThread_breakFlags] @ r8<- breakFlags
11    add     r3, r1, #1  @ Thumb addr is odd
12    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
13    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
14    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
15    sub     r10, r10, r2, lsl #2        @ r10<- bottom (newsave - outsSize)
16    cmp     r10, r9                     @ bottom < interpStackEnd?
17    bxlo    lr                          @ return to raise stack overflow excep.
18    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
19    ldr     r9, [r0, #offMethod_clazz]      @ r9<- method->clazz
20    ldr     r10, [r0, #offMethod_accessFlags] @ r10<- methodToCall->accessFlags
21    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
22    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
23    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
24
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    lr                          @ bail to the interpreter
32    tst     r10, #ACC_NATIVE
33#if !defined(WITH_SELF_VERIFICATION)
34    bne     .LinvokeNative
35#else
36    bxne    lr                          @ bail to the interpreter
37#endif
38
39    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
40    ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
41
42    @ Update "thread" values for the new method
43    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
44    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
45    mov     rFP, r1                         @ fp = newFp
46    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = newFp
47#if defined(TEMPLATE_INLINE_PROFILING)
48    stmfd   sp!, {r0-r3}                    @ preserve r0-r3
49    mov     r1, r6
50    @ r0=methodToCall, r1=rSELF
51    ldr     ip, .LdvmFastMethodTraceEnter
52    blx     ip
53    ldmfd   sp!, {r0-r3}                    @ restore r0-r3
54#endif
55
56    @ Start executing the callee
57#if defined(WITH_JIT_TUNING)
58    mov     r0, #kInlineCacheMiss
59#endif
60    bx      r10                         @ dvmJitToInterpTraceSelectNoChain
61