summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mark Mendell <mark.p.mendell@intel.com> 2015-06-29 15:41:28 -0400
committer Mark Mendell <mark.p.mendell@intel.com> 2015-12-31 12:47:50 -0500
commit8a1c728e40813d30a85a1f27afaf16a3f105d32a (patch)
tree4245fdf57ffa7a1c12b3890bd2f4b1c10c11bf5d
parent4bb356123b13ec5f41ea80158766df676ae08679 (diff)
X86_64: Replace x86_64 xchg instruction use
Replacing 'xchg' to exchange two registers with a three instruction move sequence using the 'TMP' register r10 seems to be a big win. This is because xchg is a serializing instruction, even when used on registers. Change-Id: I1c0f7687630936e7f3d2efc4b30ad11233bd484c Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
-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 7c94a8cc71..c12166e843 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -5232,6 +5232,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);
@@ -5269,7 +5275,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 9995416138..e571138678 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);