1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *  Common subroutines and data
4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * ===========================================================================
5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .text
8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LinvokeNative:
10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Prep for the native call
11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ r1 = newFP, r0 = methodToCall
12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]      @ r3<- glue->self
137a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
14d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r9, [r3, #offThread_jniLocal_topCookie] @ r9<- thread->localRef->...
157a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ not in jit code cache
16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r1, [r3, #offThread_curFrame]   @ self->curFrame = newFp
17d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r1, #(offStackSaveArea_localRefCookie - sizeofStackSaveArea)]
18d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden                                        @ newFp->localRefCookie=top
19ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, r3                      @ r9<- glue->self (preserve)
20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    SAVEAREA_FROM_FP(r10, r1)           @ r10<- new stack save area
21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r2, r0                      @ r2<- methodToCall
23ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0, r1                      @ r0<- newFP
24ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    add     r1, rGLUE, #offGlue_retval  @ r1<- &retval
25ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
26ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    LDR_PC_LR "[r2, #offMethod_nativeFunc]"
27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
28964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    @ Refresh Jit's on/off status
29964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [rGLUE, #offGlue_ppJitProfTable]
30964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
31ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ native return; r9=self, r10=newSaveArea
32ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ equivalent to dvmPopJniLocals
33ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r2, [r10, #offStackSaveArea_returnAddr] @ r2 = chaining cell ret
34d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved->top
35ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    ldr     r1, [r9, #offThread_exception] @ check for exception
36964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    ldr     r3, [r3]    @ r1 <- pointer to Jit profile table
37ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     rFP, [r9, #offThread_curFrame]  @ self->curFrame = fp
38ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r1, #0                      @ null?
39d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r0, [r9, #offThread_jniLocal_topCookie] @ new top <- old top
404f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r0, [r10, #offStackSaveArea_savedPc] @ reload rPC
41964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee    str     r3, [rGLUE, #offGlue_pJitProfTable]  @ cache current JitProfTable
4260c24f436d603c564d5351a6f81821f12635733cBen Cheng
4360c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ r0 = dalvikCallsitePC
4460c24f436d603c564d5351a6f81821f12635733cBen Cheng    bne     .LhandleException           @ no, handle exception
4560c24f436d603c564d5351a6f81821f12635733cBen Cheng
467a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r9, #offThread_inJitCodeCache] @ set the new mode
4760c24f436d603c564d5351a6f81821f12635733cBen Cheng    cmp     r2, #0                      @ return chaining cell still exists?
4860c24f436d603c564d5351a6f81821f12635733cBen Cheng    bxne    r2                          @ yes - go ahead
4960c24f436d603c564d5351a6f81821f12635733cBen Cheng
5060c24f436d603c564d5351a6f81821f12635733cBen Cheng    @ continue executing the next instruction through the interpreter
5140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
5260c24f436d603c564d5351a6f81821f12635733cBen Cheng    add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
53978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
547a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r0, #kCallsiteInterpreted
557a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif
5660c24f436d603c564d5351a6f81821f12635733cBen Cheng    mov     pc, r1
57ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
584f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/*
594f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * On entry:
604f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * r0  Faulting Dalvik PC
614f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */
62ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LhandleException:
6311d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#if defined(WITH_SELF_VERIFICATION)
6411d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    ldr     pc, .LdeadFood @ should not see this under self-verification mode
6511d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng.LdeadFood:
6611d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng    .word   0xdeadf00d
6711d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng#endif
687a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r3, [rGLUE, #offGlue_self]  @ r3<- glue->self
697a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r2, #0
707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    str     r2, [r3, #offThread_inJitCodeCache] @ in interpreter land
714f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    ldr     r1, .LdvmMterpCommonExceptionThrown @ PIC way of getting &func
72cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    ldr     rIBASE, .LdvmAsmInstructionStart    @ same as above
734f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     rPC, r0                 @ reload the faulting Dalvik address
744f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    mov     pc, r1                  @ branch to dvmMterpCommonExceptionThrown
75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
76ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .align  2
77ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmAsmInstructionStart:
78ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmAsmInstructionStart
797a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng.LdvmJitToInterpNoChainNoProfile:
807a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .word   dvmJitToInterpNoChainNoProfile
8140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng.LdvmJitToInterpTraceSelectNoChain:
8240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .word   dvmJitToInterpTraceSelectNoChain
83ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmJitToInterpNoChain:
84ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmJitToInterpNoChain
85ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.LdvmMterpStdBail:
86ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   dvmMterpStdBail
87cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng.LdvmMterpCommonExceptionThrown:
88cc6600c2702c0b29457836acde1cfc4f25c63b67Ben Cheng    .word   dvmMterpCommonExceptionThrown
89c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee.LdvmLockObject:
90c1d9ed490a7bd6caab51df41f3c9e590fcecb727Bill Buzbee    .word   dvmLockObject
91978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
92978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng.LdvmICHitCount:
93978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng    .word   gDvmICHitCount
94978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#endif
959e45c0b968d63ea38353c99252d233879c2efdafjeffhao#if defined(WITH_SELF_VERIFICATION)
969e45c0b968d63ea38353c99252d233879c2efdafjeffhao.LdvmSelfVerificationMemOpDecode:
979e45c0b968d63ea38353c99252d233879c2efdafjeffhao    .word   dvmSelfVerificationMemOpDecode
989e45c0b968d63ea38353c99252d233879c2efdafjeffhao#endif
99ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cdcmple:
100ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cdcmple
101ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L__aeabi_cfcmple:
102ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .word   __aeabi_cfcmple
103ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
104ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dmvCompilerTemplateEnd
105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdmvCompilerTemplateEnd:
106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /* WITH_JIT */
108