Refactor code using the marking register in nterp.
Use a helper to abstract away how we're looking at the marking state.
Test: test.py
Change-Id: I560ccb9a043c7d394e8befce2e9e0bca3f44e187
diff --git a/runtime/interpreter/mterp/arm64ng/array.S b/runtime/interpreter/mterp/arm64ng/array.S
index b596bfb..f43bc7d 100644
--- a/runtime/interpreter/mterp/arm64ng/array.S
+++ b/runtime/interpreter/mterp/arm64ng/array.S
@@ -23,7 +23,7 @@
GOTO_OPCODE x10 // jump to next instruction
.elseif $is_object
$load w2, [x0, #$data_offset] // w2<- vBB[vCC]
- cbnz wMR, 2f
+ TEST_IF_MARKING 2f
1:
SET_VREG_OBJECT w2, w9 // vAA<- w2
GOTO_OPCODE x10 // jump to next instruction
diff --git a/runtime/interpreter/mterp/arm64ng/main.S b/runtime/interpreter/mterp/arm64ng/main.S
index 08a7a80..ffd1b13 100644
--- a/runtime/interpreter/mterp/arm64ng/main.S
+++ b/runtime/interpreter/mterp/arm64ng/main.S
@@ -370,6 +370,10 @@
5:
.endm
+.macro TEST_IF_MARKING label
+ cbnz wMR, \label
+.endm
+
// Setup the stack to start executing the method. Expects:
// - x0 to contain the ArtMethod
//
@@ -1756,7 +1760,7 @@
EXPORT_PC
// Fast-path which gets the class from thread-local cache.
FETCH_FROM_THREAD_CACHE x0, 2f
- cbnz wMR, 3f
+ TEST_IF_MARKING 3f
1:
lsr w1, wINST, #12 // w1<- B
GET_VREG w1, w1 // w1<- vB (array length)
diff --git a/runtime/interpreter/mterp/arm64ng/object.S b/runtime/interpreter/mterp/arm64ng/object.S
index 00490a7..41131c2 100644
--- a/runtime/interpreter/mterp/arm64ng/object.S
+++ b/runtime/interpreter/mterp/arm64ng/object.S
@@ -2,7 +2,7 @@
// Fast-path which gets the class from thread-local cache.
EXPORT_PC
FETCH_FROM_THREAD_CACHE x1, 3f
- cbnz wMR, 4f
+ TEST_IF_MARKING 4f
1:
lsr w2, wINST, #8 // w2<- A
GET_VREG w0, w2 // w0<- vA (object)
@@ -28,7 +28,7 @@
// Fast-path which gets the class from thread-local cache.
EXPORT_PC
FETCH_FROM_THREAD_CACHE x1, 3f
- cbnz wMR, 4f
+ TEST_IF_MARKING 4f
1:
lsr w2, wINST, #12 // w2<- B
GET_VREG w0, w2 // w0<- vB (object)
@@ -77,7 +77,7 @@
SET_VREG_WIDE x0, w2 // fp[A] <- value
.elseif $is_object
$load w0, [x3, x0]
- cbnz wMR, .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
.L${opcode}_resume_after_read_barrier:
SET_VREG_OBJECT w0, w2 // fp[A] <- value
.else
@@ -112,7 +112,7 @@
SET_VREG_WIDE x0, w2 // fp[A] <- value
.elseif $is_object
$volatile_load w0, [x3]
- cbnz wMR, .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
SET_VREG_OBJECT w0, w2 // fp[A] <- value
.else
$volatile_load w0, [x3]
@@ -226,7 +226,7 @@
ldr w1, [x0, #ART_FIELD_OFFSET_OFFSET]
lsr w2, wINST, #8 // w2 <- A
ldr w0, [x0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cbnz wMR, .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
.L${opcode}_resume_after_read_barrier:
.if $wide
ldr x0, [x0, x1]
@@ -267,7 +267,7 @@
ldr w1, [x0, #ART_FIELD_OFFSET_OFFSET]
lsr w2, wINST, #8 // w2 <- A
ldr w0, [x0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cbnz wMR, .L${opcode}_slow_path_read_barrier
+ TEST_IF_MARKING .L${opcode}_slow_path_read_barrier
.L${opcode}_slow_path_resume_after_read_barrier:
add x0, x0, x1
.if $wide
@@ -275,7 +275,7 @@
SET_VREG_WIDE x0, w2 // fp[A] <- value
.elseif $is_object
$volatile_load w0, [x0]
- cbnz wMR, .L${opcode}_mark_after_load
+ TEST_IF_MARKING .L${opcode}_mark_after_load
SET_VREG_OBJECT w0, w2 // fp[A] <- value
.else
$volatile_load w0, [x0]
@@ -323,7 +323,7 @@
.L${opcode}_resume:
ldr w1, [x0, #ART_FIELD_OFFSET_OFFSET]
ldr w0, [x0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cbnz wMR, .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
.L${opcode}_resume_after_read_barrier:
.if $wide
$store x26, [x0, x1]
@@ -358,7 +358,7 @@
CLEAR_STATIC_VOLATILE_MARKER x0
ldr w1, [x0, #ART_FIELD_OFFSET_OFFSET]
ldr w0, [x0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cbnz wMR, .L${opcode}_slow_path_read_barrier
+ TEST_IF_MARKING .L${opcode}_slow_path_read_barrier
.L${opcode}_slow_path_resume_after_read_barrier:
add x1, x0, x1
.if $wide
@@ -384,7 +384,7 @@
EXPORT_PC
// Fast-path which gets the class from thread-local cache.
FETCH_FROM_THREAD_CACHE x0, 2f
- cbnz wMR, 3f
+ TEST_IF_MARKING 3f
4:
ldr lr, [xSELF, #THREAD_ALLOC_OBJECT_ENTRYPOINT_OFFSET]
blr lr
diff --git a/runtime/interpreter/mterp/arm64ng/other.S b/runtime/interpreter/mterp/arm64ng/other.S
index caaec3d..be42dfb 100644
--- a/runtime/interpreter/mterp/arm64ng/other.S
+++ b/runtime/interpreter/mterp/arm64ng/other.S
@@ -43,7 +43,7 @@
%def op_const_object(jumbo="0", helper="nterp_load_object"):
// Fast-path which gets the object from thread-local cache.
FETCH_FROM_THREAD_CACHE x0, 2f
- cbnz wMR, 3f
+ TEST_IF_MARKING 3f
1:
lsr w1, wINST, #8 // w1<- AA
.if $jumbo
diff --git a/runtime/interpreter/mterp/armng/array.S b/runtime/interpreter/mterp/armng/array.S
index 93f11c6..305cb93 100644
--- a/runtime/interpreter/mterp/armng/array.S
+++ b/runtime/interpreter/mterp/armng/array.S
@@ -26,8 +26,7 @@
GOTO_OPCODE ip @ jump to next instruction
.elseif $is_object
$load r2, [r0, #$data_offset] @ w2<- vBB[vCC]
- cmp rMR, #0
- bne 2f
+ TEST_IF_MARKING 2f
1:
GET_INST_OPCODE ip @ extract opcode from rINST
SET_VREG_OBJECT r2, r4 @ vAA<- w2
diff --git a/runtime/interpreter/mterp/armng/main.S b/runtime/interpreter/mterp/armng/main.S
index 13d5dfe..e21c64f 100644
--- a/runtime/interpreter/mterp/armng/main.S
+++ b/runtime/interpreter/mterp/armng/main.S
@@ -325,6 +325,11 @@
b 1b
.endm
+.macro TEST_IF_MARKING label
+ cmp rMR, #0
+ bne \label
+.endm
+
// Expects:
// - ip and lr to be available.
// Outputs:
@@ -1771,8 +1776,7 @@
EXPORT_PC
// Fast-path which gets the class from thread-local cache.
FETCH_FROM_THREAD_CACHE r0, 2f
- cmp rMR, #0
- bne 3f
+ TEST_IF_MARKING 3f
1:
lsr r1, rINST, #12 // r1<- B
GET_VREG r1, r1 // r1<- vB (array length)
diff --git a/runtime/interpreter/mterp/armng/object.S b/runtime/interpreter/mterp/armng/object.S
index c56ec05..50f1c4f 100644
--- a/runtime/interpreter/mterp/armng/object.S
+++ b/runtime/interpreter/mterp/armng/object.S
@@ -2,8 +2,7 @@
// Fast-path which gets the class from thread-local cache.
EXPORT_PC
FETCH_FROM_THREAD_CACHE r1, 3f
- cmp rMR, #0
- bne 4f
+ TEST_IF_MARKING 4f
1:
lsr r2, rINST, #8 // r2<- A
GET_VREG r0, r2 // r0<- vA (object)
@@ -30,8 +29,7 @@
// Fast-path which gets the class from thread-local cache.
EXPORT_PC
FETCH_FROM_THREAD_CACHE r1, 3f
- cmp rMR, #0
- bne 4f
+ TEST_IF_MARKING 4f
1:
lsr r2, rINST, #12 // r2<- B
GET_VREG r0, r2 // r0<- vB (object)
@@ -85,8 +83,7 @@
SET_VREG_WIDE_BY_ADDR r0, r1, r2 // fp[A] <- value
.elseif $is_object
$load r0, [r3, r0]
- cmp rMR, #0
- bne .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
.L${opcode}_resume_after_read_barrier:
SET_VREG_OBJECT r0, r2 // fp[A] <- value
.else
@@ -128,8 +125,7 @@
$load r0, [r3, r0]
dmb ish
.if $is_object
- cmp rMR, #0
- bne .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
SET_VREG_OBJECT r0, r2 // fp[A] <- value
.else
SET_VREG r0, r2 // fp[A] <- value
@@ -258,8 +254,7 @@
ldr r1, [r0, #ART_FIELD_OFFSET_OFFSET]
lsr r2, rINST, #8 // r2 <- A
ldr r0, [r0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cmp rMR, #0
- bne .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
.L${opcode}_resume_after_read_barrier:
.if $wide
add r0, r0, r1
@@ -304,8 +299,7 @@
ldr r1, [r0, #ART_FIELD_OFFSET_OFFSET]
lsr r2, rINST, #8 // r2 <- A
ldr r0, [r0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cmp rMR, #0
- bne .L${opcode}_slow_path_read_barrier
+ TEST_IF_MARKING .L${opcode}_slow_path_read_barrier
.L${opcode}_slow_path_resume_after_read_barrier:
.if $wide
add ip, r0, r1
@@ -318,8 +312,7 @@
$load r0, [r0, r1]
dmb ish
.if $is_object
- cmp rMR, #0
- bne .L${opcode}_mark_after_load
+ TEST_IF_MARKING .L${opcode}_mark_after_load
SET_VREG_OBJECT r0, r2 // fp[A] <- value
.else
SET_VREG r0, r2 // fp[A] <- value
@@ -364,8 +357,7 @@
.L${opcode}_resume:
ldr r1, [r0, #ART_FIELD_OFFSET_OFFSET]
ldr r0, [r0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cmp rMR, #0
- bne .L${opcode}_read_barrier
+ TEST_IF_MARKING .L${opcode}_read_barrier
.L${opcode}_resume_after_read_barrier:
.if $wide
lsr r2, rINST, #8 // r2 <- A
@@ -405,8 +397,7 @@
CLEAR_STATIC_VOLATILE_MARKER r0
ldr r1, [r0, #ART_FIELD_OFFSET_OFFSET]
ldr r0, [r0, #ART_FIELD_DECLARING_CLASS_OFFSET]
- cmp rMR, #0
- bne .L${opcode}_slow_path_read_barrier
+ TEST_IF_MARKING .L${opcode}_slow_path_read_barrier
.L${opcode}_slow_path_resume_after_read_barrier:
.if $wide
lsr r2, rINST, #8 // r2 <- A
@@ -440,8 +431,7 @@
EXPORT_PC
// Fast-path which gets the class from thread-local cache.
FETCH_FROM_THREAD_CACHE r0, 2f
- cmp rMR, #0
- bne 3f
+ TEST_IF_MARKING 3f
4:
ldr lr, [rSELF, #THREAD_ALLOC_OBJECT_ENTRYPOINT_OFFSET]
blx lr