Fix 64-bit CAS for x86.
Bug: 12117970
Change-Id: I9fbba2291124a2594161782c89dc62201cf01c08
diff --git a/compiler/dex/quick/x86/int_x86.cc b/compiler/dex/quick/x86/int_x86.cc
index 0133a0a..340c74a 100644
--- a/compiler/dex/quick/x86/int_x86.cc
+++ b/compiler/dex/quick/x86/int_x86.cc
@@ -295,16 +295,17 @@
if (is_long) {
FlushAllRegs();
LockCallTemps();
+ LoadValueDirectWideFixed(rl_src_expected, rAX, rDX);
+ LoadValueDirectWideFixed(rl_src_new_value, rBX, rCX);
NewLIR1(kX86Push32R, rDI);
MarkTemp(rDI);
LockTemp(rDI);
NewLIR1(kX86Push32R, rSI);
MarkTemp(rSI);
LockTemp(rSI);
- LoadValueDirectFixed(rl_src_obj, rDI);
- LoadValueDirectFixed(rl_src_offset, rSI);
- LoadValueDirectWideFixed(rl_src_expected, rAX, rDX);
- LoadValueDirectWideFixed(rl_src_new_value, rBX, rCX);
+ const int push_offset = 4 /* push edi */ + 4 /* push esi */;
+ LoadWordDisp(TargetReg(kSp), SRegOffset(rl_src_obj.s_reg_low) + push_offset, rDI);
+ LoadWordDisp(TargetReg(kSp), SRegOffset(rl_src_offset.s_reg_low) + push_offset, rSI);
NewLIR4(kX86LockCmpxchg8bA, rDI, rSI, 0, 0);
FreeTemp(rSI);
UnmarkTemp(rSI);