call SYMBOL(MterpInvokeVirtual)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/*
* Handle a virtual method call.
call SYMBOL(MterpInvokeSuper)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/*
* Handle a "super" method call.
call SYMBOL(MterpInvokeDirect)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpInvokeStatic)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
call SYMBOL(MterpInvokeInterface)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/*
* Handle an interface method call.
call SYMBOL(MterpInvokeVirtualRange)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpInvokeSuperRange)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpInvokeDirectRange)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpInvokeStaticRange)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpInvokeInterfaceRange)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpInvokeVirtualQuick)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpInvokeVirtualQuickRange)
testb %al, %al
jz MterpException
+ ADVANCE_PC 3
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
RESTORE_IBASE
- ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
call SYMBOL(MterpHandleException)
testb %al, %al
jz MterpExceptionReturn
- REFRESH_IBASE
movl OFF_FP_CODE_ITEM(rFP), %eax
movl OFF_FP_DEX_PC(rFP), %ecx
lea CODEITEM_INSNS_OFFSET(%eax), rPC
lea (rPC, %ecx, 2), rPC
movl rPC, OFF_FP_DEX_PC_PTR(rFP)
+ /* Do we need to switch interpreters? */
+ call SYMBOL(MterpShouldSwitchInterpreters)
+ testb %al, %al
+ jnz MterpFallback
/* resume execution at catch block */
+ REFRESH_IBASE
FETCH_INST
GOTO_NEXT
/* NOTE: no fallthrough */