blob: 58f784d5c00b378cdb774058a09839a59b9bf824 [file] [log] [blame]
%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),%ecx # eax<- FEDC or CCCC
movzwl 2(rPC),%edx # ecx<- BBBB
.if (!$isrange)
andl $$0xf,%ecx # eax<- C (or stays CCCC)
.endif
GET_VREG_R %ecx %ecx # ecx<- vC ("this" ptr)
testl %ecx,%ecx # null?
je common_errNullObject # yep, throw exception
movl offObject_clazz(%ecx),%eax # eax<- thisPtr->clazz
movl offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
EXPORT_PC # might throw later - get ready
movl (%eax,%edx,4),%eax # eax<- vtable[BBBB]
jmp common_invokeMethod${routine}