diff options
Diffstat (limited to 'vm/mterp/armv5te/OP_INVOKE_VIRTUAL_QUICK.S')
-rw-r--r-- | vm/mterp/armv5te/OP_INVOKE_VIRTUAL_QUICK.S | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/vm/mterp/armv5te/OP_INVOKE_VIRTUAL_QUICK.S b/vm/mterp/armv5te/OP_INVOKE_VIRTUAL_QUICK.S new file mode 100644 index 0000000..4b425da --- /dev/null +++ b/vm/mterp/armv5te/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 */ + FETCH(r3, 2) @ r3<- FEDC or CCCC + FETCH(r1, 1) @ r1<- BBBB + .if (!$isrange) + and r3, r3, #15 @ r3<- C (or stays CCCC) + .endif + GET_VREG(r9, r3) @ r9<- vC ("this" ptr) + cmp r9, #0 @ is "this" null? + beq common_errNullObject @ null "this", throw exception + ldr r2, [r9, #offObject_clazz] @ r2<- thisPtr->clazz + ldr r2, [r2, #offClassObject_vtable] @ r2<- thisPtr->clazz->vtable + EXPORT_PC() @ invoke must export + ldr r0, [r2, r1, lsl #2] @ r3<- vtable[BBBB] + bl common_invokeMethod${routine} @ (r0=method, r9="this") |