summaryrefslogtreecommitdiff
path: root/runtime/interpreter/mterp/armng/main.S
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/interpreter/mterp/armng/main.S')
-rw-r--r--runtime/interpreter/mterp/armng/main.S40
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