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