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