Index: src/compiler/x64/instruction-selector-x64.cc |
diff --git a/src/compiler/x64/instruction-selector-x64.cc b/src/compiler/x64/instruction-selector-x64.cc |
index fe668587099e1394f6cb8d99a2d4ebcf7400d9b5..d89daf25306a89882a8c1c8a961f7509ceea3b10 100644 |
--- a/src/compiler/x64/instruction-selector-x64.cc |
+++ b/src/compiler/x64/instruction-selector-x64.cc |
@@ -346,6 +346,15 @@ void InstructionSelector::VisitWord64Shr(Node* node) { |
void InstructionSelector::VisitWord32Sar(Node* node) { |
+ X64OperandGenerator g(this); |
+ Int32BinopMatcher m(node); |
+ if (CanCover(m.node(), m.left().node()) && m.left().IsWord32Shl()) { |
+ Int32BinopMatcher mleft(m.left().node()); |
+ if (mleft.right().Is(16) && m.right().Is(16)) { |
+ Emit(kX64Movsxwl, g.DefineAsRegister(node), g.Use(mleft.left().node())); |
+ return; |
+ } |
+ } |
VisitWord32Shift(this, node, kX64Sar32); |
} |
@@ -364,6 +373,7 @@ void InstructionSelector::VisitWord64Ror(Node* node) { |
VisitWord64Shift(this, node, kX64Ror); |
} |
+ |
namespace { |
AddressingMode GenerateMemoryOperandInputs(X64OperandGenerator* g, Node* scaled, |
@@ -1161,6 +1171,7 @@ InstructionSelector::SupportedMachineOperatorFlags() { |
} |
return MachineOperatorBuilder::kNoFlags; |
} |
+ |
} // namespace compiler |
} // namespace internal |
} // namespace v8 |