| 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 a7331fdee252029777b9cb06b95d759403755705..6d7fca472e6c504bc9deb8fd006e3a15008bef39 100644
|
| --- a/src/compiler/x64/instruction-selector-x64.cc
|
| +++ b/src/compiler/x64/instruction-selector-x64.cc
|
| @@ -818,37 +818,23 @@ void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
|
| }
|
|
|
|
|
| -void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) {
|
| - X64OperandGenerator g(this);
|
| - Emit(kSSEFloat64ToFloat32, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
|
| +namespace {
|
| +
|
| +void VisitRO(InstructionSelector* selector, Node* node,
|
| + InstructionCode opcode) {
|
| + X64OperandGenerator g(selector);
|
| + selector->Emit(opcode, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
|
| }
|
|
|
|
|
| -void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) {
|
| - X64OperandGenerator g(this);
|
| - Node* value = node->InputAt(0);
|
| - if (CanCover(node, value)) {
|
| - switch (value->opcode()) {
|
| - case IrOpcode::kWord64Sar:
|
| - case IrOpcode::kWord64Shr: {
|
| - Int64BinopMatcher m(value);
|
| - if (m.right().Is(32)) {
|
| - Emit(kX64Shr, g.DefineSameAsFirst(node),
|
| - g.UseRegister(m.left().node()), g.TempImmediate(32));
|
| - return;
|
| - }
|
| - break;
|
| - }
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| - Emit(kX64Movl, g.DefineAsRegister(node), g.Use(value));
|
| +void VisitRR(InstructionSelector* selector, Node* node,
|
| + InstructionCode opcode) {
|
| + X64OperandGenerator g(selector);
|
| + selector->Emit(opcode, g.DefineAsRegister(node),
|
| + g.UseRegister(node->InputAt(0)));
|
| }
|
|
|
|
|
| -namespace {
|
| -
|
| void VisitFloatBinop(InstructionSelector* selector, Node* node,
|
| ArchOpcode avx_opcode, ArchOpcode sse_opcode) {
|
| X64OperandGenerator g(selector);
|
| @@ -872,10 +858,48 @@ void VisitFloatUnop(InstructionSelector* selector, Node* node, Node* input,
|
| }
|
| }
|
|
|
| -
|
| } // namespace
|
|
|
|
|
| +void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) {
|
| + VisitRO(this, node, kSSEFloat64ToFloat32);
|
| +}
|
| +
|
| +
|
| +void InstructionSelector::VisitTruncateFloat64ToInt32(Node* node) {
|
| + switch (TruncationModeOf(node->op())) {
|
| + case TruncationMode::kJavaScript:
|
| + return VisitRR(this, node, kArchTruncateDoubleToI);
|
| + case TruncationMode::kRoundToZero:
|
| + return VisitRO(this, node, kSSEFloat64ToInt32);
|
| + }
|
| + UNREACHABLE();
|
| +}
|
| +
|
| +
|
| +void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) {
|
| + X64OperandGenerator g(this);
|
| + Node* value = node->InputAt(0);
|
| + if (CanCover(node, value)) {
|
| + switch (value->opcode()) {
|
| + case IrOpcode::kWord64Sar:
|
| + case IrOpcode::kWord64Shr: {
|
| + Int64BinopMatcher m(value);
|
| + if (m.right().Is(32)) {
|
| + Emit(kX64Shr, g.DefineSameAsFirst(node),
|
| + g.UseRegister(m.left().node()), g.TempImmediate(32));
|
| + return;
|
| + }
|
| + break;
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| + }
|
| + Emit(kX64Movl, g.DefineAsRegister(node), g.Use(value));
|
| +}
|
| +
|
| +
|
| void InstructionSelector::VisitFloat32Add(Node* node) {
|
| VisitFloatBinop(this, node, kAVXFloat32Add, kSSEFloat32Add);
|
| }
|
| @@ -914,14 +938,12 @@ void InstructionSelector::VisitFloat32Min(Node* node) {
|
|
|
|
|
| void InstructionSelector::VisitFloat32Abs(Node* node) {
|
| - X64OperandGenerator g(this);
|
| VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat32Abs, kSSEFloat32Abs);
|
| }
|
|
|
|
|
| void InstructionSelector::VisitFloat32Sqrt(Node* node) {
|
| - X64OperandGenerator g(this);
|
| - Emit(kSSEFloat32Sqrt, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
|
| + VisitRO(this, node, kSSEFloat32Sqrt);
|
| }
|
|
|
|
|
| @@ -984,37 +1006,22 @@ void InstructionSelector::VisitFloat64Min(Node* node) {
|
|
|
|
|
| void InstructionSelector::VisitFloat64Abs(Node* node) {
|
| - X64OperandGenerator g(this);
|
| VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat64Abs, kSSEFloat64Abs);
|
| }
|
|
|
|
|
| void InstructionSelector::VisitFloat64Sqrt(Node* node) {
|
| - X64OperandGenerator g(this);
|
| - Emit(kSSEFloat64Sqrt, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
|
| + VisitRO(this, node, kSSEFloat64Sqrt);
|
| }
|
|
|
|
|
| -namespace {
|
| -
|
| -void VisitRRFloat64(InstructionSelector* selector, InstructionCode opcode,
|
| - Node* node) {
|
| - X64OperandGenerator g(selector);
|
| - selector->Emit(opcode, g.DefineAsRegister(node),
|
| - g.UseRegister(node->InputAt(0)));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -
|
| void InstructionSelector::VisitFloat64RoundDown(Node* node) {
|
| - VisitRRFloat64(this, kSSEFloat64Round | MiscField::encode(kRoundDown), node);
|
| + VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundDown));
|
| }
|
|
|
|
|
| void InstructionSelector::VisitFloat64RoundTruncate(Node* node) {
|
| - VisitRRFloat64(this, kSSEFloat64Round | MiscField::encode(kRoundToZero),
|
| - node);
|
| + VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToZero));
|
| }
|
|
|
|
|
|
|