Home | History | Annotate | Download | only in armv5te
      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