| /* |
| * =========================================================================== |
| * Common subroutines and data |
| * =========================================================================== |
| */ |
| |
| .text |
| .align 2 |
| .LinvokeNative: |
| @ Prep for the native call |
| @ r1 = newFP, r0 = methodToCall |
| mov r2, #0 |
| ldr r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->... |
| str r2, [rSELF, #offThread_inJitCodeCache] @ not in jit code cache |
| str r1, [rSELF, #offThread_curFrame] @ curFrame = newFp |
| str r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)] |
| @ newFp->localRefCookie=top |
| ldrh lr, [rSELF, #offThread_subMode] |
| SAVEAREA_FROM_FP(r10, r1) @ r10<- new stack save area |
| |
| mov r2, r0 @ r2<- methodToCall |
| mov r0, r1 @ r0<- newFP |
| add r1, rSELF, #offThread_retval @ r1<- &retval |
| mov r3, rSELF @ arg3<- self |
| ands lr, #kSubModeMethodTrace |
| beq 121f @ hop if not profiling |
| @ r2: methodToCall, r6: rSELF |
| stmfd sp!, {r2,r6} |
| stmfd sp!, {r0-r3} |
| mov r0, r2 |
| mov r1, r6 |
| mov lr, pc |
| ldr pc, .LdvmFastMethodTraceEnter |
| ldmfd sp!, {r0-r3} |
| |
| mov lr, pc |
| ldr pc, [r2, #offMethod_nativeFunc] |
| |
| ldmfd sp!, {r0-r1} |
| mov lr, pc |
| ldr pc, .LdvmFastNativeMethodTraceExit |
| b 212f |
| 121: |
| mov lr, pc |
| ldr pc, [r2, #offMethod_nativeFunc] |
| 212: |
| |
| @ native return; r10=newSaveArea |
| @ equivalent to dvmPopJniLocals |
| ldr r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret |
| ldr r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top |
| ldr r1, [rSELF, #offThread_exception] @ check for exception |
| str rFP, [rSELF, #offThread_curFrame] @ curFrame = fp |
| cmp r1, #0 @ null? |
| str r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top |
| ldr r0, [r10, #offStackSaveArea_savedPc] @ reload rPC |
| |
| @ r0 = dalvikCallsitePC |
| bne .LhandleException @ no, handle exception |
| |
| str r2, [rSELF, #offThread_inJitCodeCache] @ set the new mode |
| cmp r2, #0 @ return chaining cell still exists? |
| bxne r2 @ yes - go ahead |
| |
| @ continue executing the next instruction through the interpreter |
| ldr r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S |
| add rPC, r0, #6 @ reconstruct new rPC (advance 6 bytes) |
| #if defined(WITH_JIT_TUNING) |
| mov r0, #kCallsiteInterpreted |
| #endif |
| mov pc, r1 |
| |
| /* |
| * On entry: |
| * r0 Faulting Dalvik PC |
| */ |
| .LhandleException: |
| #if defined(WITH_SELF_VERIFICATION) |
| ldr pc, .LdeadFood @ should not see this under self-verification mode |
| .LdeadFood: |
| .word 0xdeadf00d |
| #endif |
| mov r2, #0 |
| str r2, [rSELF, #offThread_inJitCodeCache] @ in interpreter land |
| ldr r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func |
| ldr rIBASE, .LdvmAsmInstructionStart @ same as above |
| mov rPC, r0 @ reload the faulting Dalvik address |
| mov pc, r1 @ branch to dvmMterpCommonExceptionThrown |
| |
| .align 2 |
| .LdvmAsmInstructionStart: |
| .word dvmAsmInstructionStart |
| .LdvmJitToInterpNoChainNoProfile: |
| .word dvmJitToInterpNoChainNoProfile |
| .LdvmJitToInterpTraceSelectNoChain: |
| .word dvmJitToInterpTraceSelectNoChain |
| .LdvmJitToInterpNoChain: |
| .word dvmJitToInterpNoChain |
| .LdvmMterpStdBail: |
| .word dvmMterpStdBail |
| .LdvmMterpCommonExceptionThrown: |
| .word dvmMterpCommonExceptionThrown |
| .LdvmLockObject: |
| .word dvmLockObject |
| .LdvmJitTraceProfilingOff: |
| .word dvmJitTraceProfilingOff |
| #if defined(WITH_JIT_TUNING) |
| .LdvmICHitCount: |
| .word gDvmICHitCount |
| #endif |
| #if defined(WITH_SELF_VERIFICATION) |
| .LdvmSelfVerificationMemOpDecode: |
| .word dvmSelfVerificationMemOpDecode |
| #endif |
| .LdvmFastMethodTraceEnter: |
| .word dvmFastMethodTraceEnter |
| .LdvmFastNativeMethodTraceExit: |
| .word dvmFastNativeMethodTraceExit |
| .LdvmFastMethodTraceExit: |
| .word dvmFastMethodTraceExit |
| .L__aeabi_cdcmple: |
| .word __aeabi_cdcmple |
| .L__aeabi_cfcmple: |
| .word __aeabi_cfcmple |
| |
| .global dmvCompilerTemplateEnd |
| dmvCompilerTemplateEnd: |
| |
| #endif /* WITH_JIT */ |