TEMPLATE_INVOKE_METHOD_NATIVE.S revision 40094c16d9727cc1e047a7d4bddffe04dd566211
138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r0 = methodToCall, r1 = returnCell, rPC = dalvikCallsite
238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldrh    r7, [r0, #offMethod_registersSize]  @ r7<- methodToCall->regsSize
338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r9, [rGLUE, #offGlue_interpStackEnd]    @ r9<- interpStackEnd
438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [rGLUE, #offGlue_pSelfSuspendCount] @ r8<- &suspendCount
538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     r3, r1, #1  @ Thumb addr is odd
638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    sub     r1, r1, r7, lsl #2          @ r1<- newFp (old savearea - regsSize)
838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- stack save area
938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r8]                    @ r3<- suspendCount (int)
1038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r10, r9                     @ bottom < interpStackEnd?
1138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bxlt    lr                          @ return to raise stack overflow excep.
1238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ r1 = newFP, r0 = methodToCall, r3 = returnCell, rPC = dalvikCallsite
1338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
1438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rPC, [r1, #(offStackSaveArea_savedPc - sizeofStackSaveArea)]
1538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     rPC, [r0, #offMethod_insns]     @ rPC<- methodToCall->insns
1638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
1738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
1838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ set up newSaveArea
1938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rFP, [r1, #(offStackSaveArea_prevFrame - sizeofStackSaveArea)]
2038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r3, [r1, #(offStackSaveArea_returnAddr - sizeofStackSaveArea)]
2138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
2238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r0, [r1, #(offStackSaveArea_method - sizeofStackSaveArea)]
2338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r8, #0                      @ suspendCount != 0
2438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r8, [r0, #offMethod_nativeFunc] @ r8<- method->nativeFunc
2597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
2638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    bxne    lr                          @ bail to the interpreter
2797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
2897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bx      lr                          @ bail to interpreter unconditionally
2997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
3038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
3138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ go ahead and transfer control to the native code
32d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
337a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
3438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
357a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ not in the jit code cache
36d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
37d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
3838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r9, r3                      @ r9<- glue->self (preserve)
3938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
4038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
4138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
4238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    mov     r0, r1                      @ r0<- newFP
4338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
4438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
4538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    blx     r8                          @ off to the native code
4638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
4738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ native return; r9=self, r10=newSaveArea
4838329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    @ equivalent to dvmPopJniLocals
4938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
50d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
5138329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    ldr     r1, [r9, #offThread_exception] @ check for exception
5238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
5338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng    cmp     r1, #0                      @ null?
54d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
55909b418219f63c0d0b2bde8a0835dbf27d5061b8Bill Buzbee    ldr     r0, [rFP, #(offStackSaveArea_currentPc - sizeofStackSaveArea)]
5660c24f436d603c564d5351a6f81821f12635733cBen Cheng
5760c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
5860c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
5960c24f436d603c564d5351a6f81821f12635733cBen Cheng
607a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r9, #offThread_inJitCodeCache] @ set the mode properly
6160c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
6260c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
6360c24f436d603c564d5351a6f81821f12635733cBen Cheng
6460c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
6540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
6660c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
677a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#if defined(EXIT_STATS)
687a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
697a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
7060c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
7160c24f436d603c564d5351a6f81821f12635733cBen Cheng
7260c24f436d603c564d5351a6f81821f12635733cBen Cheng
7338329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng
74