x86/x86_64/arm/arm64 nterp: Smaller `op_const_object`.
Test: testrunner.py --host --interpreter
Test: testrunner.py --target --interpreter
Flag: EXEMPT PURE_REFACTOR
Change-Id: I9f5db9e185662f90771e50a1232d9e10e06cb32c
diff --git a/runtime/interpreter/mterp/arm64ng/other.S b/runtime/interpreter/mterp/arm64ng/other.S
index 3470ee8..820d008 100644
--- a/runtime/interpreter/mterp/arm64ng/other.S
+++ b/runtime/interpreter/mterp/arm64ng/other.S
@@ -41,10 +41,11 @@
GOTO_OPCODE ip // jump to next instruction
%def op_const_object(jumbo="0", helper="nterp_load_object"):
+% slow_path = add_slow_path(op_const_object_slow_path, helper)
// Fast-path which gets the object from thread-local cache.
-% fetch_from_thread_cache("x0", miss_label="2f")
- TEST_IF_MARKING 3f
-1:
+% fetch_from_thread_cache("x0", miss_label=slow_path)
+ TEST_IF_MARKING 1f
+.L${opcode}_resume:
lsr w1, wINST, #8 // w1<- AA
.if $jumbo
FETCH_ADVANCE_INST 3 // advance rPC, load wINST
@@ -54,16 +55,17 @@
GET_INST_OPCODE ip // extract opcode from wINST
SET_VREG_OBJECT w0, w1 // vAA <- value
GOTO_OPCODE ip // jump to next instruction
-2:
+1:
+ bl art_quick_read_barrier_mark_reg00
+ b .L${opcode}_resume
+
+%def op_const_object_slow_path(helper):
EXPORT_PC
mov x0, xSELF
ldr x1, [sp]
mov x2, xPC
bl $helper
- b 1b
-3:
- bl art_quick_read_barrier_mark_reg00
- b 1b
+ b .L${opcode}_resume
%def op_const_class():
% op_const_object(jumbo="0", helper="nterp_get_class")
diff --git a/runtime/interpreter/mterp/armng/other.S b/runtime/interpreter/mterp/armng/other.S
index 7dfed62..68826c4 100644
--- a/runtime/interpreter/mterp/armng/other.S
+++ b/runtime/interpreter/mterp/armng/other.S
@@ -41,11 +41,12 @@
GOTO_OPCODE ip @ jump to next instruction
%def op_const_object(jumbo="0", helper="nterp_load_object"):
+% slow_path = add_slow_path(op_const_object_slow_path, helper)
// Fast-path which gets the object from thread-local cache.
-% fetch_from_thread_cache("r0", miss_label="2f")
+% fetch_from_thread_cache("r0", miss_label=slow_path)
cmp rMR, #0
- bne 3f
-1:
+ bne 1f
+.L${opcode}_resume:
mov r1, rINST, lsr #8 @ r1<- AA
.if $jumbo
FETCH_ADVANCE_INST 3 // advance rPC, load rINST
@@ -55,16 +56,17 @@
GET_INST_OPCODE ip // extract opcode from rINST
SET_VREG_OBJECT r0, r1 // vAA <- value
GOTO_OPCODE ip // jump to next instruction
-2:
+1:
+ bl art_quick_read_barrier_mark_reg00
+ b .L${opcode}_resume
+
+%def op_const_object_slow_path(helper):
EXPORT_PC
mov r0, rSELF
ldr r1, [sp]
mov r2, rPC
bl $helper
- b 1b
-3:
- bl art_quick_read_barrier_mark_reg00
- b 1b
+ b .L${opcode}_resume
%def op_const_class():
% op_const_object(jumbo="0", helper="nterp_get_class")
diff --git a/runtime/interpreter/mterp/x86_64ng/other.S b/runtime/interpreter/mterp/x86_64ng/other.S
index f789086..940d90e 100644
--- a/runtime/interpreter/mterp/x86_64ng/other.S
+++ b/runtime/interpreter/mterp/x86_64ng/other.S
@@ -29,28 +29,30 @@
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
%def op_const_object(jumbo="0", helper="nterp_load_object"):
+% slow_path = add_slow_path(op_const_object_slow_path, helper)
// Fast-path which gets the object from thread-local cache.
-% fetch_from_thread_cache("%rax", miss_label="2f")
+% fetch_from_thread_cache("%rax", miss_label=slow_path)
cmpq MACRO_LITERAL(0), rSELF:THREAD_READ_BARRIER_MARK_REG00_OFFSET
- jne 3f
-1:
+ jne 1f
+.L${opcode}_resume:
SET_VREG_OBJECT %eax, rINSTq # vAA <- value
.if $jumbo
ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
.else
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
.endif
-2:
+1:
+ // 00 is %rax
+ call art_quick_read_barrier_mark_reg00
+ jmp .L${opcode}_resume
+
+%def op_const_object_slow_path(helper):
EXPORT_PC
movq rSELF:THREAD_SELF_OFFSET, %rdi
movq 0(%rsp), %rsi
movq rPC, %rdx
call SYMBOL($helper)
- jmp 1b
-3:
- // 00 is %rax
- call art_quick_read_barrier_mark_reg00
- jmp 1b
+ jmp .L${opcode}_resume
%def op_const_class():
% op_const_object(jumbo="0", helper="nterp_get_class")
diff --git a/runtime/interpreter/mterp/x86ng/other.S b/runtime/interpreter/mterp/x86ng/other.S
index 6dd1ce3..7c78bad 100644
--- a/runtime/interpreter/mterp/x86ng/other.S
+++ b/runtime/interpreter/mterp/x86ng/other.S
@@ -29,28 +29,30 @@
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
%def op_const_object(jumbo="0", helper="nterp_load_object"):
+% slow_path = add_slow_path(op_const_object_slow_path, helper)
// Fast-path which gets the object from thread-local cache.
-% fetch_from_thread_cache("%eax", miss_label="2f")
+% fetch_from_thread_cache("%eax", miss_label=slow_path)
cmpl MACRO_LITERAL(0), rSELF:THREAD_READ_BARRIER_MARK_REG00_OFFSET
- jne 3f
-1:
+ jne 1f
+.L${opcode}_resume:
SET_VREG_OBJECT %eax, rINST # vAA <- value
.if $jumbo
ADVANCE_PC_FETCH_AND_GOTO_NEXT 3
.else
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
.endif
-2:
+1:
+ // 00 is %eax
+ call art_quick_read_barrier_mark_reg00
+ jmp .L${opcode}_resume
+
+%def op_const_object_slow_path(helper):
EXPORT_PC
movl rSELF:THREAD_SELF_OFFSET, ARG0
movl 0(%esp), ARG1
movl rPC, ARG2
call SYMBOL($helper)
- jmp 1b
-3:
- // 00 is %eax
- call art_quick_read_barrier_mark_reg00
- jmp 1b
+ jmp .L${opcode}_resume
%def op_const_class():
% op_const_object(jumbo="0", helper="nterp_get_class")