%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 ldr r0, [rSELF, #THREAD_USE_MTERP_OFFSET] cmp r0, #0 beq 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 ldr r0, [rSELF, #THREAD_USE_MTERP_OFFSET] cmp r0, #0 beq 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")