Fix CAS intrinsic to clear exclusive if values don't match.
The LDREX has a matching STREX if the values match, but it needed
a CLREX for the case where they didn't.
Bug: 10530407
Change-Id: I46b474cca326a251536e7f214c80486694431386
(cherry picked from commit 78765e84a3654357a03f84b76985556cf7d9731a)
diff --git a/compiler/dex/quick/arm/int_arm.cc b/compiler/dex/quick/arm/int_arm.cc
index f2ff58e..103dec6 100644
--- a/compiler/dex/quick/arm/int_arm.cc
+++ b/compiler/dex/quick/arm/int_arm.cc
@@ -549,10 +549,11 @@
OpRegReg(kOpCmp, r_old_value, rl_expected.low_reg);
FreeTemp(r_old_value); // Now unneeded.
RegLocation rl_result = EvalLoc(rl_dest, kCoreReg, true);
- OpIT(kCondEq, "TE");
+ OpIT(kCondEq, "TEE");
NewLIR4(kThumb2Strex, rl_result.low_reg, rl_new_value.low_reg, r_ptr, 0);
FreeTemp(r_ptr); // Now unneeded.
OpRegImm(kOpXor, rl_result.low_reg, 1);
+ NewLIR0(kThumb2Clrex);
OpRegReg(kOpXor, rl_result.low_reg, rl_result.low_reg);
StoreValue(rl_dest, rl_result);