| %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 |
| mov r0, rSELF |
| add r1, rFP, #OFF_FP_SHADOWFRAME |
| mov r2, rPC |
| mov r3, rINST |
| bl $helper |
| cmp r0, #0 |
| beq MterpException |
| FETCH_ADVANCE_INST 3 |
| bl MterpShouldSwitchInterpreters |
| cmp r0, #0 |
| bne MterpFallback |
| GET_INST_OPCODE ip |
| GOTO_OPCODE ip |
| |
| |
| %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 |
| mov r0, rSELF |
| add r1, rFP, #OFF_FP_SHADOWFRAME |
| mov r2, rPC |
| mov r3, rINST |
| bl $helper |
| cmp r0, #0 |
| beq MterpException |
| FETCH_ADVANCE_INST 4 |
| bl MterpShouldSwitchInterpreters |
| cmp r0, #0 |
| bne MterpFallback |
| GET_INST_OPCODE ip |
| GOTO_OPCODE ip |
| |
| %def op_invoke_custom(): |
| % invoke(helper="MterpInvokeCustom") |
| /* |
| * Handle an invoke-custom invocation. |
| * |
| * for: invoke-custom, invoke-custom/range |
| */ |
| /* op vB, {vD, vE, vF, vG, vA}, call_site@BBBB */ |
| /* op vAA, {vCCCC..v(CCCC+AA-1)}, call_site@BBBB */ |
| |
| %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") |
| /* |
| * Handle an interface method call. |
| * |
| * for: invoke-interface, invoke-interface/range |
| */ |
| /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ |
| /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ |
| |
| %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") |
| /* |
| * Handle a "super" method call. |
| * |
| * for: invoke-super, invoke-super/range |
| */ |
| /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ |
| /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ |
| |
| %def op_invoke_super_range(): |
| % invoke(helper="MterpInvokeSuperRange") |
| |
| %def op_invoke_virtual(): |
| % invoke(helper="MterpInvokeVirtual") |
| /* |
| * Handle a virtual method call. |
| * |
| * for: invoke-virtual, invoke-virtual/range |
| */ |
| /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ |
| /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ |
| |
| %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") |