Home | History | Annotate | Download | only in mips
      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