1    /*
2     * To support deadlock prediction, this version of MONITOR_ENTER
3     * will always call the heavyweight dvmLockObject, check for an
4     * exception and then bail out to the interpreter.
5     *
6     * On entry:
7     *    a0 - self pointer
8     *    a1 - the object (which has already been null-checked by the caller
9     *    rPC - the Dalvik PC of the following instruction.
10     *
11     */
12    la     a2, .LdvmLockObject
13    lw     t9, (a2)
14    sw     zero, offThread_inJitCodeCache(a0)   # record that we're not returning
15    JALR(t9)                                    # dvmLockObject(self, obj)
16    lw     gp, STACK_OFFSET_GP(sp)
17
18    # test for exception
19    lw     a1, offThread_exception(rSELF)
20    beqz   a1, 1f
21    sub    a0, rPC, 2                           # roll dPC back to this monitor instruction
22    j      .LhandleException
231:
24    # Bail to interpreter - no chain [note - rPC still contains dPC]
25#if defined(WITH_JIT_TUNING)
26    li     a0, kHeavyweightMonitor
27#endif
28    la     a2, .LdvmJitToInterpNoChain
29    lw     a2, (a2)
30    jr     a2
31