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 movl rSELF, %ecx 10 movl %ecx, OUT_ARG0(%esp) 11 leal OFF_FP_SHADOWFRAME(rFP), %eax 12 movl %eax, OUT_ARG1(%esp) 13 movl rPC, OUT_ARG2(%esp) 14 REFRESH_INST ${opnum} 15 movl rINST, OUT_ARG3(%esp) 16 call SYMBOL($helper) 17 testb %al, %al 18 jz MterpException 19 ADVANCE_PC 3 20 movl rSELF, %eax 21 cmpb LITERAL(0), THREAD_USE_MTERP_OFFSET(%eax) 22 jz MterpFallback 23 RESTORE_IBASE 24 FETCH_INST 25 GOTO_NEXT 26 27%def invoke_polymorphic(helper="UndefinedInvokeHandler"): 28 /* 29 * invoke-polymorphic handler wrapper. 30 */ 31 /* op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH */ 32 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB, proto@HHHH */ 33 .extern $helper 34 EXPORT_PC 35 movl rSELF, %ecx 36 movl %ecx, OUT_ARG0(%esp) 37 leal OFF_FP_SHADOWFRAME(rFP), %eax 38 movl %eax, OUT_ARG1(%esp) 39 movl rPC, OUT_ARG2(%esp) 40 REFRESH_INST ${opnum} 41 movl rINST, OUT_ARG3(%esp) 42 call SYMBOL($helper) 43 testb %al, %al 44 jz MterpException 45 ADVANCE_PC 4 46 movl rSELF, %eax 47 cmpb LITERAL(0), THREAD_USE_MTERP_OFFSET(%eax) 48 jz MterpFallback 49 RESTORE_IBASE 50 FETCH_INST 51 GOTO_NEXT 52 53%def op_invoke_custom(): 54% invoke(helper="MterpInvokeCustom") 55 56%def op_invoke_custom_range(): 57% invoke(helper="MterpInvokeCustomRange") 58 59%def op_invoke_direct(): 60% invoke(helper="MterpInvokeDirect") 61 62%def op_invoke_direct_range(): 63% invoke(helper="MterpInvokeDirectRange") 64 65%def op_invoke_interface(): 66% invoke(helper="MterpInvokeInterface") 67/* 68 * Handle an interface method call. 69 * 70 * for: invoke-interface, invoke-interface/range 71 */ 72 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 73 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 74 75%def op_invoke_interface_range(): 76% invoke(helper="MterpInvokeInterfaceRange") 77 78%def op_invoke_polymorphic(): 79% invoke_polymorphic(helper="MterpInvokePolymorphic") 80 81%def op_invoke_polymorphic_range(): 82% invoke_polymorphic(helper="MterpInvokePolymorphicRange") 83 84%def op_invoke_static(): 85% invoke(helper="MterpInvokeStatic") 86 87 88%def op_invoke_static_range(): 89% invoke(helper="MterpInvokeStaticRange") 90 91%def op_invoke_super(): 92% invoke(helper="MterpInvokeSuper") 93/* 94 * Handle a "super" method call. 95 * 96 * for: invoke-super, invoke-super/range 97 */ 98 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 99 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 100 101%def op_invoke_super_range(): 102% invoke(helper="MterpInvokeSuperRange") 103 104%def op_invoke_virtual(): 105% invoke(helper="MterpInvokeVirtual") 106/* 107 * Handle a virtual method call. 108 * 109 * for: invoke-virtual, invoke-virtual/range 110 */ 111 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 112 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 113 114%def op_invoke_virtual_quick(): 115% invoke(helper="MterpInvokeVirtualQuick") 116 117%def op_invoke_virtual_range(): 118% invoke(helper="MterpInvokeVirtualRange") 119 120%def op_invoke_virtual_range_quick(): 121% invoke(helper="MterpInvokeVirtualQuickRange") 122