diff options
| author | 2015-06-29 15:41:28 -0400 | |
|---|---|---|
| committer | 2015-12-31 12:47:50 -0500 | |
| commit | 8a1c728e40813d30a85a1f27afaf16a3f105d32a (patch) | |
| tree | 4245fdf57ffa7a1c12b3890bd2f4b1c10c11bf5d | |
| parent | 4bb356123b13ec5f41ea80158766df676ae08679 (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.cc | 8 | ||||
| -rw-r--r-- | compiler/optimizing/code_generator_x86_64.h | 1 |
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); |