| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/instruction-selector-impl.h" | 5 #include "src/compiler/instruction-selector-impl.h" |
| 6 #include "src/compiler/node-matchers.h" | 6 #include "src/compiler/node-matchers.h" |
| 7 #include "src/compiler/node-properties.h" | 7 #include "src/compiler/node-properties.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 1588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1599 | 1599 |
| 1600 | 1600 |
| 1601 void InstructionSelector::VisitFloat64ExtractHighWord32(Node* node) { | 1601 void InstructionSelector::VisitFloat64ExtractHighWord32(Node* node) { |
| 1602 Arm64OperandGenerator g(this); | 1602 Arm64OperandGenerator g(this); |
| 1603 Emit(kArm64Float64ExtractHighWord32, g.DefineAsRegister(node), | 1603 Emit(kArm64Float64ExtractHighWord32, g.DefineAsRegister(node), |
| 1604 g.UseRegister(node->InputAt(0))); | 1604 g.UseRegister(node->InputAt(0))); |
| 1605 } | 1605 } |
| 1606 | 1606 |
| 1607 | 1607 |
| 1608 void InstructionSelector::VisitFloat64InsertLowWord32(Node* node) { | 1608 void InstructionSelector::VisitFloat64InsertLowWord32(Node* node) { |
| 1609 // TODO(arm64): Some AArch64 specialist should be able to improve this. | |
| 1610 Arm64OperandGenerator g(this); | 1609 Arm64OperandGenerator g(this); |
| 1611 Node* left = node->InputAt(0); | 1610 Node* left = node->InputAt(0); |
| 1612 Node* right = node->InputAt(1); | 1611 Node* right = node->InputAt(1); |
| 1612 if (left->opcode() == IrOpcode::kFloat64InsertHighWord32 && |
| 1613 CanCover(node, left)) { |
| 1614 Node* right_of_left = left->InputAt(1); |
| 1615 Emit(kArm64Bfi, g.DefineSameAsFirst(right), g.UseRegister(right), |
| 1616 g.UseRegister(right_of_left), g.TempImmediate(32), |
| 1617 g.TempImmediate(32)); |
| 1618 Emit(kArm64Float64MoveU64, g.DefineAsRegister(node), g.UseRegister(right)); |
| 1619 return; |
| 1620 } |
| 1613 Emit(kArm64Float64InsertLowWord32, g.DefineAsRegister(node), | 1621 Emit(kArm64Float64InsertLowWord32, g.DefineAsRegister(node), |
| 1614 g.UseRegister(left), g.UseRegister(right)); | 1622 g.UseRegister(left), g.UseRegister(right)); |
| 1615 } | 1623 } |
| 1616 | 1624 |
| 1617 | 1625 |
| 1618 void InstructionSelector::VisitFloat64InsertHighWord32(Node* node) { | 1626 void InstructionSelector::VisitFloat64InsertHighWord32(Node* node) { |
| 1619 // TODO(arm64): Some AArch64 specialist should be able to improve this. | |
| 1620 Arm64OperandGenerator g(this); | 1627 Arm64OperandGenerator g(this); |
| 1621 Node* left = node->InputAt(0); | 1628 Node* left = node->InputAt(0); |
| 1622 Node* right = node->InputAt(1); | 1629 Node* right = node->InputAt(1); |
| 1630 if (left->opcode() == IrOpcode::kFloat64InsertLowWord32 && |
| 1631 CanCover(node, left)) { |
| 1632 Node* right_of_left = left->InputAt(1); |
| 1633 Emit(kArm64Bfi, g.DefineSameAsFirst(left), g.UseRegister(right_of_left), |
| 1634 g.UseRegister(right), g.TempImmediate(32), g.TempImmediate(32)); |
| 1635 Emit(kArm64Float64MoveU64, g.DefineAsRegister(node), g.UseRegister(left)); |
| 1636 return; |
| 1637 } |
| 1623 Emit(kArm64Float64InsertHighWord32, g.DefineAsRegister(node), | 1638 Emit(kArm64Float64InsertHighWord32, g.DefineAsRegister(node), |
| 1624 g.UseRegister(left), g.UseRegister(right)); | 1639 g.UseRegister(left), g.UseRegister(right)); |
| 1625 } | 1640 } |
| 1626 | 1641 |
| 1627 | 1642 |
| 1628 // static | 1643 // static |
| 1629 MachineOperatorBuilder::Flags | 1644 MachineOperatorBuilder::Flags |
| 1630 InstructionSelector::SupportedMachineOperatorFlags() { | 1645 InstructionSelector::SupportedMachineOperatorFlags() { |
| 1631 return MachineOperatorBuilder::kFloat64RoundDown | | 1646 return MachineOperatorBuilder::kFloat64RoundDown | |
| 1632 MachineOperatorBuilder::kFloat64RoundTruncate | | 1647 MachineOperatorBuilder::kFloat64RoundTruncate | |
| 1633 MachineOperatorBuilder::kFloat64RoundTiesAway | | 1648 MachineOperatorBuilder::kFloat64RoundTiesAway | |
| 1634 MachineOperatorBuilder::kWord32ShiftIsSafe | | 1649 MachineOperatorBuilder::kWord32ShiftIsSafe | |
| 1635 MachineOperatorBuilder::kInt32DivIsSafe | | 1650 MachineOperatorBuilder::kInt32DivIsSafe | |
| 1636 MachineOperatorBuilder::kUint32DivIsSafe; | 1651 MachineOperatorBuilder::kUint32DivIsSafe; |
| 1637 } | 1652 } |
| 1638 | 1653 |
| 1639 } // namespace compiler | 1654 } // namespace compiler |
| 1640 } // namespace internal | 1655 } // namespace internal |
| 1641 } // namespace v8 | 1656 } // namespace v8 |
| OLD | NEW |