[x64] Replace movl_subl instruction with leal
This eliminates one instruction for following pattern: movl rX, rY // TruncateInt64ToInt32 subl rX, imm32 ==> leal rX, [rY - imm32] R=bmeurer@chromium.org Change-Id: I4164e1407f5953302051e905555da14d3ca6680a Reviewed-on: https://chromium-review.googlesource.com/1046381 Reviewed-by: Benedikt Meurer <bmeurer@chromium.org> Commit-Queue: Kanghua Yu <kanghua.yu@intel.com> Cr-Commit-Position: refs/heads/master@{#53021}
This commit is contained in:
parent
6380476c71
commit
aa6e58ce9d
@ -832,6 +832,19 @@ void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
|
||||
|
||||
void InstructionSelector::VisitInt32Sub(Node* node) {
|
||||
X64OperandGenerator g(this);
|
||||
DCHECK_EQ(node->InputCount(), 2);
|
||||
Node* input1 = node->InputAt(0);
|
||||
Node* input2 = node->InputAt(1);
|
||||
if (input1->opcode() == IrOpcode::kTruncateInt64ToInt32 &&
|
||||
g.CanBeImmediate(input2)) {
|
||||
// Omit truncation and turn subtractions of constant values into immediate
|
||||
// "leal" instructions by negating the value.
|
||||
Emit(kX64Lea32 | AddressingModeField::encode(kMode_MRI),
|
||||
g.DefineAsRegister(node), g.UseRegister(input1->InputAt(0)),
|
||||
g.TempImmediate(-g.GetImmediateIntegerValue(input2)));
|
||||
return;
|
||||
}
|
||||
|
||||
Int32BinopMatcher m(node);
|
||||
if (m.left().Is(0)) {
|
||||
Emit(kX64Neg32, g.DefineSameAsFirst(node), g.UseRegister(m.right().node()));
|
||||
|
Loading…
Reference in New Issue
Block a user