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 EXPORT_PC 9 mov x0, xSELF 10 add x1, xFP, #OFF_FP_SHADOWFRAME 11 mov x2, xPC 12 mov x3, xINST 13 bl $helper 14 cbz w0, MterpException 15 FETCH_ADVANCE_INST 3 16 ldr w0, [xSELF, #THREAD_USE_MTERP_OFFSET] 17 cbz w0, MterpFallback 18 GET_INST_OPCODE ip 19 GOTO_OPCODE ip 20 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 EXPORT_PC 30 mov x0, xSELF 31 add x1, xFP, #OFF_FP_SHADOWFRAME 32 mov x2, xPC 33 mov x3, xINST 34 bl $helper 35 cbz w0, MterpException 36 FETCH_ADVANCE_INST 4 37 ldr w0, [xSELF, #THREAD_USE_MTERP_OFFSET] 38 cbz w0, MterpFallback 39 GET_INST_OPCODE ip 40 GOTO_OPCODE ip 41 42%def op_invoke_custom(): 43% invoke(helper="MterpInvokeCustom") 44 45%def op_invoke_custom_range(): 46% invoke(helper="MterpInvokeCustomRange") 47 48%def op_invoke_direct(): 49% invoke(helper="MterpInvokeDirect") 50 51%def op_invoke_direct_range(): 52% invoke(helper="MterpInvokeDirectRange") 53 54%def op_invoke_interface(): 55% invoke(helper="MterpInvokeInterface") 56 /* 57 * Handle an interface method call. 58 * 59 * for: invoke-interface, invoke-interface/range 60 */ 61 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 62 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 63 64%def op_invoke_interface_range(): 65% invoke(helper="MterpInvokeInterfaceRange") 66 67%def op_invoke_polymorphic(): 68% invoke_polymorphic(helper="MterpInvokePolymorphic") 69 70%def op_invoke_polymorphic_range(): 71% invoke_polymorphic(helper="MterpInvokePolymorphicRange") 72 73%def op_invoke_static(): 74% invoke(helper="MterpInvokeStatic") 75 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