Commit 5c1babcc authored by shiyu.zhang's avatar shiyu.zhang Committed by Commit bot

[ia32] Optimize index calculation for certain checked load/stores.

It reduces the add operation for certain checked load/stores by pre-do the add in compiling phase.

BUG=

Review-Url: https://codereview.chromium.org/2563483005
Cr-Commit-Position: refs/heads/master@{#41671}
parent 0c827cd0
This diff is collapsed.
......@@ -395,18 +395,25 @@ void InstructionSelector::VisitCheckedLoad(Node* node) {
UNREACHABLE();
return;
}
InstructionOperand offset_operand = g.UseRegister(offset);
Int32Matcher mbuffer(buffer);
InstructionOperand buffer_operand =
mbuffer.HasValue() ? g.UseImmediate(buffer) : g.UseRegister(buffer);
if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) {
Int32Matcher mlength(length);
Int32BinopMatcher moffset(offset);
if (mlength.HasValue() && moffset.right().HasValue() &&
moffset.right().Value() > 0 &&
mlength.Value() >= moffset.right().Value()) {
Emit(opcode, g.DefineAsRegister(node), buffer_operand,
g.UseRegister(moffset.left().node()),
g.UseImmediate(moffset.right().node()), g.UseImmediate(length));
return;
}
}
InstructionOperand length_operand =
g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length);
if (g.CanBeImmediate(buffer)) {
Emit(opcode | AddressingModeField::encode(kMode_MRI),
g.DefineAsRegister(node), offset_operand, length_operand,
offset_operand, g.UseImmediate(buffer));
} else {
Emit(opcode | AddressingModeField::encode(kMode_MR1),
g.DefineAsRegister(node), offset_operand, length_operand,
g.UseRegister(buffer), offset_operand);
}
Emit(opcode, g.DefineAsRegister(node), buffer_operand, g.UseRegister(offset),
g.TempImmediate(0), length_operand);
}
......@@ -450,18 +457,26 @@ void InstructionSelector::VisitCheckedStore(Node* node) {
rep == MachineRepresentation::kBit)
? g.UseByteRegister(value)
: g.UseRegister(value));
InstructionOperand offset_operand = g.UseRegister(offset);
Int32Matcher mbuffer(buffer);
InstructionOperand buffer_operand =
mbuffer.HasValue() ? g.UseImmediate(buffer) : g.UseRegister(buffer);
if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) {
Int32Matcher mlength(length);
Int32BinopMatcher moffset(offset);
if (mlength.HasValue() && moffset.right().HasValue() &&
moffset.right().Value() > 0 &&
mlength.Value() >= moffset.right().Value()) {
Emit(opcode, g.NoOutput(), buffer_operand,
g.UseRegister(moffset.left().node()),
g.UseImmediate(moffset.right().node()), g.UseImmediate(length),
value_operand);
return;
}
}
InstructionOperand length_operand =
g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length);
if (g.CanBeImmediate(buffer)) {
Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
offset_operand, length_operand, value_operand, offset_operand,
g.UseImmediate(buffer));
} else {
Emit(opcode | AddressingModeField::encode(kMode_MR1), g.NoOutput(),
offset_operand, length_operand, value_operand, g.UseRegister(buffer),
offset_operand);
}
Emit(opcode, g.NoOutput(), buffer_operand, g.UseRegister(offset),
g.TempImmediate(0), length_operand, value_operand);
}
namespace {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment