You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.7 KiB
105 lines
2.7 KiB
4 months ago
|
%def invoke(helper="UndefinedInvokeHandler"):
|
||
|
/*
|
||
|
* Generic invoke handler wrapper.
|
||
|
*/
|
||
|
/* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
|
||
|
/* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
|
||
|
.extern $helper
|
||
|
EXPORT_PC
|
||
|
mov x0, xSELF
|
||
|
add x1, xFP, #OFF_FP_SHADOWFRAME
|
||
|
mov x2, xPC
|
||
|
mov x3, xINST
|
||
|
bl $helper
|
||
|
cbz w0, MterpException
|
||
|
FETCH_ADVANCE_INST 3
|
||
|
ldr w0, [xSELF, #THREAD_USE_MTERP_OFFSET]
|
||
|
cbz w0, MterpFallback
|
||
|
GET_INST_OPCODE ip
|
||
|
GOTO_OPCODE ip
|
||
|
|
||
|
|
||
|
%def invoke_polymorphic(helper="UndefinedInvokeHandler"):
|
||
|
/*
|
||
|
* invoke-polymorphic handler wrapper.
|
||
|
*/
|
||
|
/* op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH */
|
||
|
/* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB, proto@HHHH */
|
||
|
.extern $helper
|
||
|
EXPORT_PC
|
||
|
mov x0, xSELF
|
||
|
add x1, xFP, #OFF_FP_SHADOWFRAME
|
||
|
mov x2, xPC
|
||
|
mov x3, xINST
|
||
|
bl $helper
|
||
|
cbz w0, MterpException
|
||
|
FETCH_ADVANCE_INST 4
|
||
|
ldr w0, [xSELF, #THREAD_USE_MTERP_OFFSET]
|
||
|
cbz w0, MterpFallback
|
||
|
GET_INST_OPCODE ip
|
||
|
GOTO_OPCODE ip
|
||
|
|
||
|
%def op_invoke_custom():
|
||
|
% invoke(helper="MterpInvokeCustom")
|
||
|
|
||
|
%def op_invoke_custom_range():
|
||
|
% invoke(helper="MterpInvokeCustomRange")
|
||
|
|
||
|
%def op_invoke_direct():
|
||
|
% invoke(helper="MterpInvokeDirect")
|
||
|
|
||
|
%def op_invoke_direct_range():
|
||
|
% invoke(helper="MterpInvokeDirectRange")
|
||
|
|
||
|
%def op_invoke_interface():
|
||
|
% invoke(helper="MterpInvokeInterface")
|
||
|
/*
|
||
|
* Handle an interface method call.
|
||
|
*
|
||
|
* for: invoke-interface, invoke-interface/range
|
||
|
*/
|
||
|
/* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
|
||
|
/* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
|
||
|
|
||
|
%def op_invoke_interface_range():
|
||
|
% invoke(helper="MterpInvokeInterfaceRange")
|
||
|
|
||
|
%def op_invoke_polymorphic():
|
||
|
% invoke_polymorphic(helper="MterpInvokePolymorphic")
|
||
|
|
||
|
%def op_invoke_polymorphic_range():
|
||
|
% invoke_polymorphic(helper="MterpInvokePolymorphicRange")
|
||
|
|
||
|
%def op_invoke_static():
|
||
|
% invoke(helper="MterpInvokeStatic")
|
||
|
|
||
|
|
||
|
%def op_invoke_static_range():
|
||
|
% invoke(helper="MterpInvokeStaticRange")
|
||
|
|
||
|
%def op_invoke_super():
|
||
|
% invoke(helper="MterpInvokeSuper")
|
||
|
/*
|
||
|
* Handle a "super" method call.
|
||
|
*
|
||
|
* for: invoke-super, invoke-super/range
|
||
|
*/
|
||
|
/* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
|
||
|
/* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
|
||
|
|
||
|
%def op_invoke_super_range():
|
||
|
% invoke(helper="MterpInvokeSuperRange")
|
||
|
|
||
|
%def op_invoke_virtual():
|
||
|
% invoke(helper="MterpInvokeVirtual")
|
||
|
/*
|
||
|
* Handle a virtual method call.
|
||
|
*
|
||
|
* for: invoke-virtual, invoke-virtual/range
|
||
|
*/
|
||
|
/* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
|
||
|
/* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
|
||
|
|
||
|
%def op_invoke_virtual_range():
|
||
|
% invoke(helper="MterpInvokeVirtualRange")
|