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/base/adapters.h" | 5 #include "src/base/adapters.h" |
6 #include "src/compiler/instruction-selector-impl.h" | 6 #include "src/compiler/instruction-selector-impl.h" |
7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 } | 120 } |
121 | 121 |
122 bool CanBeBetterLeftOperand(Node* node) const { | 122 bool CanBeBetterLeftOperand(Node* node) const { |
123 return !selector()->IsLive(node); | 123 return !selector()->IsLive(node); |
124 } | 124 } |
125 }; | 125 }; |
126 | 126 |
127 | 127 |
128 namespace { | 128 namespace { |
129 | 129 |
130 void VisitROFloat(InstructionSelector* selector, Node* node, | 130 void VisitRO(InstructionSelector* selector, Node* node, ArchOpcode opcode) { |
131 ArchOpcode opcode) { | |
132 IA32OperandGenerator g(selector); | 131 IA32OperandGenerator g(selector); |
133 selector->Emit(opcode, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | 132 selector->Emit(opcode, g.DefineAsRegister(node), g.Use(node->InputAt(0))); |
134 } | 133 } |
135 | 134 |
136 | 135 |
137 void VisitRRFloat(InstructionSelector* selector, Node* node, | 136 void VisitRR(InstructionSelector* selector, Node* node, |
138 InstructionCode opcode) { | 137 InstructionCode opcode) { |
139 IA32OperandGenerator g(selector); | 138 IA32OperandGenerator g(selector); |
140 selector->Emit(opcode, g.DefineAsRegister(node), | 139 selector->Emit(opcode, g.DefineAsRegister(node), |
141 g.UseRegister(node->InputAt(0))); | 140 g.UseRegister(node->InputAt(0))); |
142 } | 141 } |
143 | 142 |
144 | 143 |
145 void VisitRROFloat(InstructionSelector* selector, Node* node, | 144 void VisitRROFloat(InstructionSelector* selector, Node* node, |
146 ArchOpcode avx_opcode, ArchOpcode sse_opcode) { | 145 ArchOpcode avx_opcode, ArchOpcode sse_opcode) { |
147 IA32OperandGenerator g(selector); | 146 IA32OperandGenerator g(selector); |
148 InstructionOperand operand0 = g.UseRegister(node->InputAt(0)); | 147 InstructionOperand operand0 = g.UseRegister(node->InputAt(0)); |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 VisitMod(this, node, kIA32Idiv); | 640 VisitMod(this, node, kIA32Idiv); |
642 } | 641 } |
643 | 642 |
644 | 643 |
645 void InstructionSelector::VisitUint32Mod(Node* node) { | 644 void InstructionSelector::VisitUint32Mod(Node* node) { |
646 VisitMod(this, node, kIA32Udiv); | 645 VisitMod(this, node, kIA32Udiv); |
647 } | 646 } |
648 | 647 |
649 | 648 |
650 void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) { | 649 void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) { |
651 IA32OperandGenerator g(this); | 650 VisitRO(this, node, kSSEFloat32ToFloat64); |
652 Emit(kSSEFloat32ToFloat64, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
653 } | 651 } |
654 | 652 |
655 | 653 |
656 void InstructionSelector::VisitChangeInt32ToFloat64(Node* node) { | 654 void InstructionSelector::VisitChangeInt32ToFloat64(Node* node) { |
657 IA32OperandGenerator g(this); | 655 VisitRO(this, node, kSSEInt32ToFloat64); |
658 Emit(kSSEInt32ToFloat64, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
659 } | 656 } |
660 | 657 |
661 | 658 |
662 void InstructionSelector::VisitChangeUint32ToFloat64(Node* node) { | 659 void InstructionSelector::VisitChangeUint32ToFloat64(Node* node) { |
663 IA32OperandGenerator g(this); | 660 VisitRO(this, node, kSSEUint32ToFloat64); |
664 Emit(kSSEUint32ToFloat64, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
665 } | 661 } |
666 | 662 |
667 | 663 |
668 void InstructionSelector::VisitChangeFloat64ToInt32(Node* node) { | 664 void InstructionSelector::VisitChangeFloat64ToInt32(Node* node) { |
669 IA32OperandGenerator g(this); | 665 VisitRO(this, node, kSSEFloat64ToInt32); |
670 Emit(kSSEFloat64ToInt32, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
671 } | 666 } |
672 | 667 |
673 | 668 |
674 void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { | 669 void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { |
675 IA32OperandGenerator g(this); | 670 VisitRO(this, node, kSSEFloat64ToUint32); |
676 Emit(kSSEFloat64ToUint32, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
677 } | 671 } |
678 | 672 |
679 | 673 |
680 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { | 674 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { |
681 IA32OperandGenerator g(this); | 675 VisitRO(this, node, kSSEFloat64ToFloat32); |
682 Emit(kSSEFloat64ToFloat32, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
683 } | 676 } |
684 | 677 |
685 | 678 |
| 679 void InstructionSelector::VisitTruncateFloat64ToInt32(Node* node) { |
| 680 switch (TruncationModeOf(node->op())) { |
| 681 case TruncationMode::kJavaScript: |
| 682 return VisitRR(this, node, kArchTruncateDoubleToI); |
| 683 case TruncationMode::kRoundToZero: |
| 684 return VisitRO(this, node, kSSEFloat64ToInt32); |
| 685 } |
| 686 UNREACHABLE(); |
| 687 } |
| 688 |
| 689 |
686 void InstructionSelector::VisitFloat32Add(Node* node) { | 690 void InstructionSelector::VisitFloat32Add(Node* node) { |
687 VisitRROFloat(this, node, kAVXFloat32Add, kSSEFloat32Add); | 691 VisitRROFloat(this, node, kAVXFloat32Add, kSSEFloat32Add); |
688 } | 692 } |
689 | 693 |
690 | 694 |
691 void InstructionSelector::VisitFloat64Add(Node* node) { | 695 void InstructionSelector::VisitFloat64Add(Node* node) { |
692 VisitRROFloat(this, node, kAVXFloat64Add, kSSEFloat64Add); | 696 VisitRROFloat(this, node, kAVXFloat64Add, kSSEFloat64Add); |
693 } | 697 } |
694 | 698 |
695 | 699 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
784 } | 788 } |
785 | 789 |
786 | 790 |
787 void InstructionSelector::VisitFloat64Abs(Node* node) { | 791 void InstructionSelector::VisitFloat64Abs(Node* node) { |
788 IA32OperandGenerator g(this); | 792 IA32OperandGenerator g(this); |
789 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat64Abs, kSSEFloat64Abs); | 793 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat64Abs, kSSEFloat64Abs); |
790 } | 794 } |
791 | 795 |
792 | 796 |
793 void InstructionSelector::VisitFloat32Sqrt(Node* node) { | 797 void InstructionSelector::VisitFloat32Sqrt(Node* node) { |
794 VisitROFloat(this, node, kSSEFloat32Sqrt); | 798 VisitRO(this, node, kSSEFloat32Sqrt); |
795 } | 799 } |
796 | 800 |
797 | 801 |
798 void InstructionSelector::VisitFloat64Sqrt(Node* node) { | 802 void InstructionSelector::VisitFloat64Sqrt(Node* node) { |
799 VisitROFloat(this, node, kSSEFloat64Sqrt); | 803 VisitRO(this, node, kSSEFloat64Sqrt); |
800 } | 804 } |
801 | 805 |
802 | 806 |
803 void InstructionSelector::VisitFloat64RoundDown(Node* node) { | 807 void InstructionSelector::VisitFloat64RoundDown(Node* node) { |
804 VisitRRFloat(this, node, kSSEFloat64Round | MiscField::encode(kRoundDown)); | 808 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundDown)); |
805 } | 809 } |
806 | 810 |
807 | 811 |
808 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { | 812 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { |
809 VisitRRFloat(this, node, kSSEFloat64Round | MiscField::encode(kRoundToZero)); | 813 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToZero)); |
810 } | 814 } |
811 | 815 |
812 | 816 |
813 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { | 817 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { |
814 UNREACHABLE(); | 818 UNREACHABLE(); |
815 } | 819 } |
816 | 820 |
817 | 821 |
818 void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { | 822 void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
819 IA32OperandGenerator g(this); | 823 IA32OperandGenerator g(this); |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1338 if (CpuFeatures::IsSupported(SSE4_1)) { | 1342 if (CpuFeatures::IsSupported(SSE4_1)) { |
1339 flags |= MachineOperatorBuilder::kFloat64RoundDown | | 1343 flags |= MachineOperatorBuilder::kFloat64RoundDown | |
1340 MachineOperatorBuilder::kFloat64RoundTruncate; | 1344 MachineOperatorBuilder::kFloat64RoundTruncate; |
1341 } | 1345 } |
1342 return flags; | 1346 return flags; |
1343 } | 1347 } |
1344 | 1348 |
1345 } // namespace compiler | 1349 } // namespace compiler |
1346 } // namespace internal | 1350 } // namespace internal |
1347 } // namespace v8 | 1351 } // namespace v8 |
OLD | NEW |