summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Roland Levillain <rpl@google.com> 2016-10-28 13:18:47 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-10-28 13:18:47 +0000
commit270b6aeb11d973dc1b339ccf892468e0ad3989e3 (patch)
tree81a2cc1991f59821e0266898f72c21719670c8e7
parentb5cc1d1321e36d38cd48ae079438a8758b82edc1 (diff)
parent24a4d11cdc5975215af079dc3d658b79e9b0717e (diff)
Merge "Use CLREX in ARM/ARM64 CAS intrinsic Baker read barrier slow paths."
-rw-r--r--compiler/optimizing/code_generator_arm.cc13
-rw-r--r--compiler/optimizing/code_generator_arm64.cc7
2 files changed, 14 insertions, 6 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc
index 959a0f1991..dfdb4190de 100644
--- a/compiler/optimizing/code_generator_arm.cc
+++ b/compiler/optimizing/code_generator_arm.cc
@@ -805,19 +805,24 @@ class ReadBarrierMarkAndUpdateFieldSlowPathARM : public SlowPathCodeARM {
// tmp = [r_ptr] - expected;
// } while (tmp == 0 && failure([r_ptr] <- r_new_value));
- Label loop_head;
+ Label loop_head, exit_loop;
__ Bind(&loop_head);
__ ldrex(tmp, tmp_ptr);
__ subs(tmp, tmp, ShifterOperand(expected));
- __ it(EQ, ItState::kItT);
- __ strex(tmp, value, tmp_ptr, EQ);
- __ cmp(tmp, ShifterOperand(1), EQ);
+ __ it(NE);
+ __ clrex(NE);
+ __ b(&exit_loop, NE);
+
+ __ strex(tmp, value, tmp_ptr);
+ __ cmp(tmp, ShifterOperand(1));
__ b(&loop_head, EQ);
+ __ Bind(&exit_loop);
+
if (kPoisonHeapReferences) {
__ UnpoisonHeapReference(expected);
if (value == expected) {
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index 60d7faf738..642d883702 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -794,13 +794,16 @@ class ReadBarrierMarkAndUpdateFieldSlowPathARM64 : public SlowPathCodeARM64 {
// tmp_value = [tmp_ptr] - expected;
// } while (tmp_value == 0 && failure([tmp_ptr] <- r_new_value));
- vixl::aarch64::Label loop_head, exit_loop;
+ vixl::aarch64::Label loop_head, comparison_failed, exit_loop;
__ Bind(&loop_head);
__ Ldxr(tmp_value, MemOperand(tmp_ptr));
__ Cmp(tmp_value, expected);
- __ B(&exit_loop, ne);
+ __ B(&comparison_failed, ne);
__ Stxr(tmp_value, value, MemOperand(tmp_ptr));
__ Cbnz(tmp_value, &loop_head);
+ __ B(&exit_loop);
+ __ Bind(&comparison_failed);
+ __ Clrex();
__ Bind(&exit_loop);
if (kPoisonHeapReferences) {