blob: 08fd1bb9ff04b0b266b0a03f3aef66f835f0dc32 [file] [log] [blame]
David Srbeckyff74a742018-09-06 11:30:36 +01001%def invoke(helper="UndefinedInvokeHandler"):
buzbee1452bee2015-03-06 14:43:04 -08002 /*
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 r0, rSELF
10 add r1, rFP, #OFF_FP_SHADOWFRAME
11 mov r2, rPC
12 mov r3, rINST
13 bl $helper
14 cmp r0, #0
15 beq MterpException
16 FETCH_ADVANCE_INST 3
David Srbecky28f6cff2018-10-16 15:07:28 +010017 ldr r0, [rSELF, #THREAD_USE_MTERP_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +000018 cmp r0, #0
David Srbecky28f6cff2018-10-16 15:07:28 +010019 beq MterpFallback
buzbee1452bee2015-03-06 14:43:04 -080020 GET_INST_OPCODE ip
21 GOTO_OPCODE ip
22
David Srbeckyb2b52a52018-09-06 16:41:23 +010023
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 mov r0, rSELF
33 add r1, rFP, #OFF_FP_SHADOWFRAME
34 mov r2, rPC
35 mov r3, rINST
36 bl $helper
37 cmp r0, #0
38 beq MterpException
39 FETCH_ADVANCE_INST 4
David Srbecky28f6cff2018-10-16 15:07:28 +010040 ldr r0, [rSELF, #THREAD_USE_MTERP_OFFSET]
David Srbeckyb2b52a52018-09-06 16:41:23 +010041 cmp r0, #0
David Srbecky28f6cff2018-10-16 15:07:28 +010042 beq MterpFallback
David Srbeckyb2b52a52018-09-06 16:41:23 +010043 GET_INST_OPCODE ip
44 GOTO_OPCODE ip
45
46%def op_invoke_custom():
47% invoke(helper="MterpInvokeCustom")
48 /*
49 * Handle an invoke-custom invocation.
50 *
51 * for: invoke-custom, invoke-custom/range
52 */
53 /* op vB, {vD, vE, vF, vG, vA}, call_site@BBBB */
54 /* op vAA, {vCCCC..v(CCCC+AA-1)}, call_site@BBBB */
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")