1%def invoke(helper="UndefinedInvokeHandler"): 2 /* 3 * Generic invoke handler wrapper. 4 */ 5 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 6 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 7 .extern $helper 8 .extern MterpShouldSwitchInterpreters 9 EXPORT_PC 10 move a0, rSELF 11 daddu a1, rFP, OFF_FP_SHADOWFRAME 12 move a2, rPC 13 move a3, rINST 14 jal $helper 15 beqzc v0, MterpException 16 FETCH_ADVANCE_INST 3 17 jal MterpShouldSwitchInterpreters 18 bnezc v0, MterpFallback 19 GET_INST_OPCODE v0 20 GOTO_OPCODE v0 21 22%def invoke_polymorphic(helper="UndefinedInvokeHandler"): 23 /* 24 * invoke-polymorphic handler wrapper. 25 */ 26 /* op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH */ 27 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB, proto@HHHH */ 28 .extern $helper 29 .extern MterpShouldSwitchInterpreters 30 EXPORT_PC 31 move a0, rSELF 32 daddu a1, rFP, OFF_FP_SHADOWFRAME 33 move a2, rPC 34 move a3, rINST 35 jal $helper 36 beqzc v0, MterpException 37 FETCH_ADVANCE_INST 4 38 jal MterpShouldSwitchInterpreters 39 bnezc v0, MterpFallback 40 GET_INST_OPCODE v0 41 GOTO_OPCODE v0 42 43%def op_invoke_custom(): 44% invoke(helper="MterpInvokeCustom") 45 46%def op_invoke_custom_range(): 47% invoke(helper="MterpInvokeCustomRange") 48 49%def op_invoke_direct(): 50% invoke(helper="MterpInvokeDirect") 51 52%def op_invoke_direct_range(): 53% invoke(helper="MterpInvokeDirectRange") 54 55%def op_invoke_interface(): 56% invoke(helper="MterpInvokeInterface") 57 /* 58 * Handle an interface method call. 59 * 60 * for: invoke-interface, invoke-interface/range 61 */ 62 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 63 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 64 65%def op_invoke_interface_range(): 66% invoke(helper="MterpInvokeInterfaceRange") 67 68%def op_invoke_polymorphic(): 69% invoke_polymorphic(helper="MterpInvokePolymorphic") 70 71%def op_invoke_polymorphic_range(): 72% invoke_polymorphic(helper="MterpInvokePolymorphicRange") 73 74%def op_invoke_static(): 75% invoke(helper="MterpInvokeStatic") 76 77%def op_invoke_static_range(): 78% invoke(helper="MterpInvokeStaticRange") 79 80%def op_invoke_super(): 81% invoke(helper="MterpInvokeSuper") 82 /* 83 * Handle a "super" method call. 84 * 85 * for: invoke-super, invoke-super/range 86 */ 87 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 88 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 89 90%def op_invoke_super_range(): 91% invoke(helper="MterpInvokeSuperRange") 92 93%def op_invoke_virtual(): 94% invoke(helper="MterpInvokeVirtual") 95 /* 96 * Handle a virtual method call. 97 * 98 * for: invoke-virtual, invoke-virtual/range 99 */ 100 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 101 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 102 103%def op_invoke_virtual_quick(): 104% invoke(helper="MterpInvokeVirtualQuick") 105 106%def op_invoke_virtual_range(): 107% invoke(helper="MterpInvokeVirtualRange") 108 109%def op_invoke_virtual_range_quick(): 110% invoke(helper="MterpInvokeVirtualQuickRange") 111