| %def invoke(helper="UndefinedInvokeHandler"): |
| /* |
| * Generic invoke handler wrapper. |
| */ |
| /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ |
| /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ |
| .extern $helper |
| EXPORT_PC() |
| move a0, rSELF |
| addu a1, rFP, OFF_FP_SHADOWFRAME |
| move a2, rPC |
| move a3, rINST |
| JAL($helper) |
| beqz v0, MterpException |
| FETCH_ADVANCE_INST(3) |
| JAL(MterpShouldSwitchInterpreters) |
| bnez v0, MterpFallback |
| GET_INST_OPCODE(t0) |
| GOTO_OPCODE(t0) |
| |
| %def invoke_polymorphic(helper="UndefinedInvokeHandler"): |
| /* |
| * invoke-polymorphic handler wrapper. |
| */ |
| /* op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH */ |
| /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB, proto@HHHH */ |
| .extern $helper |
| EXPORT_PC() |
| move a0, rSELF |
| addu a1, rFP, OFF_FP_SHADOWFRAME |
| move a2, rPC |
| move a3, rINST |
| JAL($helper) |
| beqz v0, MterpException |
| FETCH_ADVANCE_INST(4) |
| JAL(MterpShouldSwitchInterpreters) |
| bnez v0, MterpFallback |
| GET_INST_OPCODE(t0) |
| GOTO_OPCODE(t0) |
| |
| %def op_invoke_custom(): |
| % invoke(helper="MterpInvokeCustom") |
| |
| %def op_invoke_custom_range(): |
| % invoke(helper="MterpInvokeCustomRange") |
| |
| %def op_invoke_direct(): |
| % invoke(helper="MterpInvokeDirect") |
| |
| %def op_invoke_direct_range(): |
| % invoke(helper="MterpInvokeDirectRange") |
| |
| %def op_invoke_interface(): |
| % invoke(helper="MterpInvokeInterface") |
| |
| %def op_invoke_interface_range(): |
| % invoke(helper="MterpInvokeInterfaceRange") |
| |
| %def op_invoke_polymorphic(): |
| % invoke_polymorphic(helper="MterpInvokePolymorphic") |
| |
| %def op_invoke_polymorphic_range(): |
| % invoke_polymorphic(helper="MterpInvokePolymorphicRange") |
| |
| %def op_invoke_static(): |
| % invoke(helper="MterpInvokeStatic") |
| |
| %def op_invoke_static_range(): |
| % invoke(helper="MterpInvokeStaticRange") |
| |
| %def op_invoke_super(): |
| % invoke(helper="MterpInvokeSuper") |
| |
| %def op_invoke_super_range(): |
| % invoke(helper="MterpInvokeSuperRange") |
| |
| %def op_invoke_virtual(): |
| % invoke(helper="MterpInvokeVirtual") |
| |
| %def op_invoke_virtual_quick(): |
| % invoke(helper="MterpInvokeVirtualQuick") |
| |
| %def op_invoke_virtual_range(): |
| % invoke(helper="MterpInvokeVirtualRange") |
| |
| %def op_invoke_virtual_range_quick(): |
| % invoke(helper="MterpInvokeVirtualQuickRange") |