1 /* 2 * For polymorphic callsites - setup the Dalvik frame and load Dalvik PC 3 * into rPC then jump to dvmJitToInterpNoChain to dispatch the 4 * runtime-resolved callee. 5 */ 6 # a0 = methodToCall, a1 = returnCell, rPC = dalvikCallsite 7 lh t7, offMethod_registersSize(a0) # t7<- methodToCall->regsSize 8 lh a2, offMethod_outsSize(a0) # a2<- methodToCall->outsSize 9 lw t9, offThread_interpStackEnd(rSELF) # t9<- interpStackEnd 10 lbu t8, offThread_breakFlags(rSELF) # t8<- breakFlags 11 move a3, a1 # a3<- returnCell 12 SAVEAREA_FROM_FP(a1, rFP) # a1<- stack save area 13 sll t6, t7, 2 # multiply regsSize by 4 (4 bytes per reg) 14 sub a1, a1, t6 # a1<- newFp(old savearea-regsSize) 15 SAVEAREA_FROM_FP(t0, a1) # t0<- stack save area 16 sll t6, a2, 2 # multiply outsSize by 4 (4 bytes per reg) 17 sub t0, t0, t6 # t0<- bottom (newsave-outsSize) 18 bgeu t0, t9, 1f # bottom < interpStackEnd? 19 RETURN # return to raise stack overflow excep. 20 21 1: 22 # a1 = newFP, a0 = methodToCall, a3 = returnCell, rPC = dalvikCallsite 23 lw t9, offMethod_clazz(a0) # t9<- methodToCall->clazz 24 lw t0, offMethod_accessFlags(a0) # t0<- methodToCall->accessFlags 25 sw rPC, (offStackSaveArea_currentPc - sizeofStackSaveArea)(rFP) 26 sw rPC, (offStackSaveArea_savedPc - sizeofStackSaveArea)(a1) 27 lw rPC, offMethod_insns(a0) # rPC<- methodToCall->insns 28 29 # set up newSaveArea 30 sw rFP, (offStackSaveArea_prevFrame - sizeofStackSaveArea)(a1) 31 sw a3, (offStackSaveArea_returnAddr - sizeofStackSaveArea)(a1) 32 sw a0, (offStackSaveArea_method - sizeofStackSaveArea)(a1) 33 beqz t8, 2f # breakFlags != 0 34 RETURN # bail to the interpreter 35 36 2: 37 and t6, t0, ACC_NATIVE 38 beqz t6, 3f 39 #if !defined(WITH_SELF_VERIFICATION) 40 j .LinvokeNative 41 #else 42 RETURN # bail to the interpreter 43 #endif 44 45 3: 46 # continue executing the next instruction through the interpreter 47 la t0, .LdvmJitToInterpTraceSelectNoChain # defined in footer.S 48 lw rTEMP, (t0) 49 lw a3, offClassObject_pDvmDex(t9) # a3<- method->clazz->pDvmDex 50 51 # Update "thread" values for the new method 52 sw a0, offThread_method(rSELF) # self->method = methodToCall 53 sw a3, offThread_methodClassDex(rSELF) # self->methodClassDex = ... 54 move rFP, a1 # fp = newFp 55 sw rFP, offThread_curFrame(rSELF) # self->curFrame = newFp 56 #if defined(TEMPLATE_INLINE_PROFILING) 57 # preserve rTEMP,a1-a3 58 SCRATCH_STORE(rTEMP, 0) 59 SCRATCH_STORE(a1, 4) 60 SCRATCH_STORE(a2, 8) 61 SCRATCH_STORE(a3, 12) 62 63 # a0=methodToCall, a1=rSELF 64 move a1, rSELF 65 la t9, dvmFastMethodTraceEnter 66 JALR(t9) 67 lw gp, STACK_OFFSET_GP(sp) 68 69 # restore rTEMP,a1-a3 70 SCRATCH_LOAD(a3, 12) 71 SCRATCH_LOAD(a2, 8) 72 SCRATCH_LOAD(a1, 4) 73 SCRATCH_LOAD(rTEMP, 0) 74 #endif 75 76 # Start executing the callee 77 #if defined(WITH_JIT_TUNING) 78 li a0, kInlineCacheMiss 79 #endif 80 jr rTEMP # dvmJitToInterpTraceSelectNoChain 81