TEMPLATE_RETURN.S revision a8b91c52fd8a90b784835dfe1f8898035266c4dd
1    /*
2     * Unwind a frame from the Dalvik stack for compiled OP_RETURN_XXX.
3     * If the stored value in returnAddr
4     * is non-zero, the caller is compiled by the JIT thus return to the
5     * address in the code cache following the invoke instruction. Otherwise
6     * return to the special dvmJitToInterpNoChain entry point.
7     */
8#if defined(TEMPLATE_INLINE_PROFILING)
9    # preserve a0-a2 and ra
10    SCRATCH_STORE(a0, 0)
11    SCRATCH_STORE(a1, 4)
12    SCRATCH_STORE(a2, 8)
13    SCRATCH_STORE(ra, 12)
14
15    # a0=rSELF
16    move    a0, rSELF
17    la      t9, dvmFastMethodTraceExit
18    JALR(t9)
19    lw      gp, STACK_OFFSET_GP(sp)
20
21    # restore a0-a2 and ra
22    SCRATCH_LOAD(ra, 12)
23    SCRATCH_LOAD(a2, 8)
24    SCRATCH_LOAD(a1, 4)
25    SCRATCH_LOAD(a0, 0)
26#endif
27    SAVEAREA_FROM_FP(a0, rFP)           # a0<- saveArea (old)
28    lw      t0, offStackSaveArea_prevFrame(a0)     # t0<- saveArea->prevFrame
29    lbu     t1, offThread_breakFlags(rSELF)        # t1<- breakFlags
30    lw      rPC, offStackSaveArea_savedPc(a0)      # rPC<- saveArea->savedPc
31#if !defined(WITH_SELF_VERIFICATION)
32    lw      t2,  offStackSaveArea_returnAddr(a0)   # t2<- chaining cell ret
33#else
34    move    t2, zero                               # disable chaining
35#endif
36    lw      a2, offStackSaveArea_method - sizeofStackSaveArea(t0)
37                                                   # a2<- method we're returning to
38#if !defined(WITH_SELF_VERIFICATION)
39    beq     a2, zero, 1f                           # bail to interpreter
40#else
41    bne     a2, zero, 2f
42    JALR(ra)                                       # punt to interpreter and compare state
43    # DOUG: assume this does not return ???
442:
45#endif
46    la      t4, .LdvmJitToInterpNoChainNoProfile   # defined in footer.S
47    lw      a1, (t4)
48    move    rFP, t0                                # publish new FP
49    beq     a2, zero, 4f
50    lw      t0, offMethod_clazz(a2)                # t0<- method->clazz
514:
52
53    sw      a2, offThread_method(rSELF)            # self->method = newSave->method
54    lw      a0, offClassObject_pDvmDex(t0)         # a0<- method->clazz->pDvmDex
55    sw      rFP, offThread_curFrame(rSELF)         # self->curFrame = fp
56    add     rPC, rPC, 3*2                          # publish new rPC
57    sw      a0, offThread_methodClassDex(rSELF)
58    movn    t2, zero, t1                           # check the breadFlags and
59                                                   # clear the chaining cell address
60    sw      t2, offThread_inJitCodeCache(rSELF)    # in code cache or not
61    beq     t2, zero, 3f                           # chaining cell exists?
62    JALR(t2)                                       # jump to the chaining cell
63    # DOUG: assume this does not return ???
643:
65#if defined(WITH_JIT_TUNING)
66    li      a0, kCallsiteInterpreted
67#endif
68    j       a1                                     # callsite is interpreted
691:
70    sw      zero, offThread_inJitCodeCache(rSELF)  # reset inJitCodeCache
71    SAVE_PC_TO_SELF()                              # SAVE_PC_FP_TO_SELF()
72    SAVE_FP_TO_SELF()
73    la      t4, .LdvmMterpStdBail                  # defined in footer.S
74    lw      a2, (t4)
75    move    a0, rSELF                              # Expecting rSELF in a0
76    JALR(a2)                                       # exit the interpreter
77    # DOUG: assume this does not return ???
78