diff options
Diffstat (limited to 'runtime/interpreter/mterp/armng/main.S')
-rw-r--r-- | runtime/interpreter/mterp/armng/main.S | 40 |
1 files changed, 12 insertions, 28 deletions
diff --git a/runtime/interpreter/mterp/armng/main.S b/runtime/interpreter/mterp/armng/main.S index 680c8ad1d0..7095f58e53 100644 --- a/runtime/interpreter/mterp/armng/main.S +++ b/runtime/interpreter/mterp/armng/main.S @@ -961,6 +961,10 @@ END \name .endif .Lcall_compiled_code_\suffix: + .if \is_interface + // Save hidden argument. + vmov s16, r4 + .endif GET_SHORTY rINST, \is_interface, \is_polymorphic, \is_custom // From this point: // - rINST contains shorty (in callee-save to switch over return value after call). @@ -1022,10 +1026,8 @@ END \name bl art_quick_invoke_custom .else .if \is_interface - // Setup hidden argument. As we don't have access to the interface method, - // just pass the method from the IMT. If the method is the conflict trampoline, - // this will make the stub go to runtime, otherwise the hidden argument is unused. - mov ip, r0 + // Setup hidden argument. + vmov ip, s16 .endif ldr lr, [r0, #ART_METHOD_QUICK_CODE_OFFSET_32] blx lr @@ -1160,6 +1162,10 @@ END \name .endif .Lcall_compiled_code_range_\suffix: + .if \is_interface + // Save hidden argument. + vmov s16, r4 + .endif GET_SHORTY rINST, \is_interface, \is_polymorphic, \is_custom // From this point: // - rINST contains shorty (in callee-save to switch over return value after call). @@ -1217,10 +1223,8 @@ END \name bl art_quick_invoke_custom .else .if \is_interface - // Setup hidden argument. As we don't have access to the interface method, - // just pass the method from the IMT. If the method is the conflict trampoline, - // this will make the stub go to runtime, otherwise the hidden argument is unused. - mov ip, r0 + // Setup hidden argument. + vmov ip, s16 .endif ldr lr, [r0, #ART_METHOD_QUICK_CODE_OFFSET_32] blx lr @@ -1551,26 +1555,6 @@ NterpNewArray: bl art_quick_read_barrier_mark_reg00 b 1b -NterpHandleInvokeInterfaceOnObjectMethodRange: - // First argument is the 'this' pointer. - FETCH r1, 2 - GET_VREG r1, r1 - // Note: if r1 is null, this will be handled by our SIGSEGV handler. - ldr r2, [r1, #MIRROR_OBJECT_CLASS_OFFSET] - add r2, r2, #MIRROR_CLASS_VTABLE_OFFSET_32 - ldr r0, [r2, r0, lsl #2] - b NterpCommonInvokeInstanceRange - -NterpHandleInvokeInterfaceOnObjectMethod: - // First argument is the 'this' pointer. - FETCH r1, 2 - and r1, r1, #0xf - GET_VREG r1, r1 - // Note: if r1 is null, this will be handled by our SIGSEGV handler. - ldr r2, [r1, #MIRROR_OBJECT_CLASS_OFFSET] - add r2, r2, #MIRROR_CLASS_VTABLE_OFFSET_32 - ldr r0, [r2, r0, lsl #2] - b NterpCommonInvokeInstance NterpHandleHotnessOverflow: add r1, rPC, rINST, lsl #1 |