From 33bf2459e6cfe477a9be0c45aec3f6f359ee077c Mon Sep 17 00:00:00 2001 From: Mark Mendell Date: Wed, 27 May 2015 10:08:24 -0400 Subject: [PATCH] [optimizing] x86: Prefer add over lea if possible Looking at some generated code, I noticed an lea being used when an add was sufficient. Check for that case, and generate the add. Fixed for x86 and x86_64. Change-Id: I110304ff0fed8837ada96d34353a293d29022ce5 Signed-off-by: Mark Mendell --- compiler/optimizing/code_generator_x86.cc | 2 ++ compiler/optimizing/code_generator_x86_64.cc | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index a6f01dad3..597d27eb1 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -1959,6 +1959,8 @@ void InstructionCodeGeneratorX86::VisitAdd(HAdd* add) { if (second.IsRegister()) { if (out.AsRegister() == first.AsRegister()) { __ addl(out.AsRegister(), second.AsRegister()); + } else if (out.AsRegister() == second.AsRegister()) { + __ addl(out.AsRegister(), first.AsRegister()); } else { __ leal(out.AsRegister(), Address( first.AsRegister(), second.AsRegister(), TIMES_1, 0)); diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index f49c26db2..68e0065e6 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -2117,6 +2117,8 @@ void InstructionCodeGeneratorX86_64::VisitAdd(HAdd* add) { if (second.IsRegister()) { if (out.AsRegister() == first.AsRegister()) { __ addl(out.AsRegister(), second.AsRegister()); + } else if (out.AsRegister() == second.AsRegister()) { + __ addl(out.AsRegister(), first.AsRegister()); } else { __ leal(out.AsRegister(), Address( first.AsRegister(), second.AsRegister(), TIMES_1, 0)); @@ -2140,6 +2142,8 @@ void InstructionCodeGeneratorX86_64::VisitAdd(HAdd* add) { if (second.IsRegister()) { if (out.AsRegister() == first.AsRegister()) { __ addq(out.AsRegister(), second.AsRegister()); + } else if (out.AsRegister() == second.AsRegister()) { + __ addq(out.AsRegister(), first.AsRegister()); } else { __ leaq(out.AsRegister(), Address( first.AsRegister(), second.AsRegister(), TIMES_1, 0)); -- 2.11.0