diff options
| author | 2016-10-28 13:18:47 +0000 | |
|---|---|---|
| committer | 2016-10-28 13:18:47 +0000 | |
| commit | 270b6aeb11d973dc1b339ccf892468e0ad3989e3 (patch) | |
| tree | 81a2cc1991f59821e0266898f72c21719670c8e7 | |
| parent | b5cc1d1321e36d38cd48ae079438a8758b82edc1 (diff) | |
| parent | 24a4d11cdc5975215af079dc3d658b79e9b0717e (diff) | |
Merge "Use CLREX in ARM/ARM64 CAS intrinsic Baker read barrier slow paths."
| -rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 13 | ||||
| -rw-r--r-- | compiler/optimizing/code_generator_arm64.cc | 7 |
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) { |