summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mark Mendell <mark.p.mendell@intel.com> 2016-03-30 10:08:25 +0000
committer android-build-merger <android-build-merger@google.com> 2016-03-30 10:08:25 +0000
commit01098af7a530ca65dcf5a40b3799c5147e49bd64 (patch)
tree3d5e5cc12abcc7165371d617c0d2769075348873
parent9049d072d9d815c8056d80d700cffa4b97971ecd (diff)
parenta1eff4f279253bbc90d2697d7c15390bcab65d1e (diff)
Merge "X86_64: Replace x86_64 xchg instruction use"
am: a1eff4f * commit 'a1eff4f279253bbc90d2697d7c15390bcab65d1e': X86_64: Replace x86_64 xchg instruction use Change-Id: I3a95d8b662a424f0f218acf31894fdf86b4bbca2
-rw-r--r--compiler/optimizing/code_generator_x86_64.cc8
-rw-r--r--compiler/optimizing/code_generator_x86_64.h1
2 files changed, 8 insertions, 1 deletions
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index d24b5bbd56..b20043c545 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -5249,6 +5249,12 @@ void ParallelMoveResolverX86_64::Exchange32(int mem1, int mem2) {
CpuRegister(ensure_scratch.GetRegister()));
}
+void ParallelMoveResolverX86_64::Exchange64(CpuRegister reg1, CpuRegister reg2) {
+ __ movq(CpuRegister(TMP), reg1);
+ __ movq(reg1, reg2);
+ __ movq(reg2, CpuRegister(TMP));
+}
+
void ParallelMoveResolverX86_64::Exchange64(CpuRegister reg, int mem) {
__ movq(CpuRegister(TMP), Address(CpuRegister(RSP), mem));
__ movq(Address(CpuRegister(RSP), mem), reg);
@@ -5286,7 +5292,7 @@ void ParallelMoveResolverX86_64::EmitSwap(size_t index) {
Location destination = move->GetDestination();
if (source.IsRegister() && destination.IsRegister()) {
- __ xchgq(destination.AsRegister<CpuRegister>(), source.AsRegister<CpuRegister>());
+ Exchange64(source.AsRegister<CpuRegister>(), destination.AsRegister<CpuRegister>());
} else if (source.IsRegister() && destination.IsStackSlot()) {
Exchange32(source.AsRegister<CpuRegister>(), destination.GetStackIndex());
} else if (source.IsStackSlot() && destination.IsRegister()) {
diff --git a/compiler/optimizing/code_generator_x86_64.h b/compiler/optimizing/code_generator_x86_64.h
index c3fce6e824..396ddf2889 100644
--- a/compiler/optimizing/code_generator_x86_64.h
+++ b/compiler/optimizing/code_generator_x86_64.h
@@ -142,6 +142,7 @@ class ParallelMoveResolverX86_64 : public ParallelMoveResolverWithSwap {
void Exchange32(CpuRegister reg, int mem);
void Exchange32(XmmRegister reg, int mem);
void Exchange32(int mem1, int mem2);
+ void Exchange64(CpuRegister reg1, CpuRegister reg2);
void Exchange64(CpuRegister reg, int mem);
void Exchange64(XmmRegister reg, int mem);
void Exchange64(int mem1, int mem2);