diff options
Diffstat (limited to 'vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S')
-rw-r--r-- | vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S b/vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S new file mode 100644 index 0000000..14202d8 --- /dev/null +++ b/vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S @@ -0,0 +1,23 @@ +%default { "isrange":"0", "routine":"NoRange" } +%verify "executed" +%verify "null object" + /* + * Handle an optimized virtual method call. + * + * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range + */ + /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ + /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ + movzwl 4(rPC),%eax # eax<- FEDC or CCCC + movzwl 2(rPC),%ecx # ecx<- BBBB + .if (!$isrange) + andl $$0xf,%eax # eax<- C (or stays CCCC) + .endif + GET_VREG_R %eax %eax # eax<- vC ("this" ptr) + testl %eax,%eax # null? + je common_errNullObject # yep, throw exception + movl offObject_clazz(%eax),%eax # eax<- thisPtr->clazz + movl offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable + EXPORT_PC # might throw later - get ready + movl (%eax,%ecx,4),%eax # eax<- vtable[BBBB] + jmp common_invokeMethod${routine} |