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/bits.h" | 5 #include "src/base/bits.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 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 case kArmVcmpF64: | 93 case kArmVcmpF64: |
94 case kArmVaddF64: | 94 case kArmVaddF64: |
95 case kArmVsubF64: | 95 case kArmVsubF64: |
96 case kArmVmulF64: | 96 case kArmVmulF64: |
97 case kArmVmlaF64: | 97 case kArmVmlaF64: |
98 case kArmVmlsF64: | 98 case kArmVmlsF64: |
99 case kArmVdivF64: | 99 case kArmVdivF64: |
100 case kArmVmodF64: | 100 case kArmVmodF64: |
101 case kArmVnegF64: | 101 case kArmVnegF64: |
102 case kArmVsqrtF64: | 102 case kArmVsqrtF64: |
103 case kArmVfloorF64: | |
104 case kArmVceilF64: | |
105 case kArmVroundTruncateF64: | |
106 case kArmVroundTiesAwayF64: | |
103 case kArmVcvtF32F64: | 107 case kArmVcvtF32F64: |
104 case kArmVcvtF64F32: | 108 case kArmVcvtF64F32: |
105 case kArmVcvtF64S32: | 109 case kArmVcvtF64S32: |
106 case kArmVcvtF64U32: | 110 case kArmVcvtF64U32: |
107 case kArmVcvtS32F64: | 111 case kArmVcvtS32F64: |
108 case kArmVcvtU32F64: | 112 case kArmVcvtU32F64: |
109 case kArmPush: | 113 case kArmPush: |
110 return false; | 114 return false; |
111 } | 115 } |
112 UNREACHABLE(); | 116 UNREACHABLE(); |
113 return false; | 117 return false; |
114 } | 118 } |
115 }; | 119 }; |
116 | 120 |
117 | 121 |
122 static void VisitRRFloat64(InstructionSelector* selector, ArchOpcode opcode, | |
123 Node* node) { | |
124 ArmOperandGenerator g(selector); | |
125 selector->Emit(opcode, g.DefineAsRegister(node), | |
126 g.UseRegister(node->InputAt(0))); | |
127 } | |
128 | |
129 | |
118 static void VisitRRRFloat64(InstructionSelector* selector, ArchOpcode opcode, | 130 static void VisitRRRFloat64(InstructionSelector* selector, ArchOpcode opcode, |
119 Node* node) { | 131 Node* node) { |
120 ArmOperandGenerator g(selector); | 132 ArmOperandGenerator g(selector); |
121 selector->Emit(opcode, g.DefineAsRegister(node), | 133 selector->Emit(opcode, g.DefineAsRegister(node), |
122 g.UseRegister(node->InputAt(0)), | 134 g.UseRegister(node->InputAt(0)), |
123 g.UseRegister(node->InputAt(1))); | 135 g.UseRegister(node->InputAt(1))); |
124 } | 136 } |
125 | 137 |
126 | 138 |
127 static bool TryMatchROR(InstructionSelector* selector, | 139 static bool TryMatchROR(InstructionSelector* selector, |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
819 g.UseFixed(node->InputAt(1), d1))->MarkAsCall(); | 831 g.UseFixed(node->InputAt(1), d1))->MarkAsCall(); |
820 } | 832 } |
821 | 833 |
822 | 834 |
823 void InstructionSelector::VisitFloat64Sqrt(Node* node) { | 835 void InstructionSelector::VisitFloat64Sqrt(Node* node) { |
824 ArmOperandGenerator g(this); | 836 ArmOperandGenerator g(this); |
825 Emit(kArmVsqrtF64, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); | 837 Emit(kArmVsqrtF64, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
826 } | 838 } |
827 | 839 |
828 | 840 |
841 void InstructionSelector::VisitFloat64Floor(Node* node) { | |
842 if (!CpuFeatures::IsSupported(ARMv8)) { | |
Benedikt Meurer
2014/10/30 11:59:12
I think this should be DCHECK(CpuFeatures::IsSuppo
sigurds
2014/10/30 12:18:26
Done.
| |
843 UNSUPPORTED_OPERATOR(node); | |
844 } | |
845 VisitRRFloat64(this, kArmVfloorF64, node); | |
846 } | |
847 | |
848 | |
849 void InstructionSelector::VisitFloat64Ceil(Node* node) { | |
850 if (!CpuFeatures::IsSupported(ARMv8)) { | |
Benedikt Meurer
2014/10/30 11:59:12
I think this should be DCHECK(CpuFeatures::IsSuppo
sigurds
2014/10/30 12:18:26
Done.
| |
851 UNSUPPORTED_OPERATOR(node); | |
852 } | |
853 VisitRRFloat64(this, kArmVceilF64, node); | |
854 } | |
855 | |
856 | |
857 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { | |
858 if (!CpuFeatures::IsSupported(ARMv8)) { | |
Benedikt Meurer
2014/10/30 11:59:12
I think this should be DCHECK(CpuFeatures::IsSuppo
sigurds
2014/10/30 12:18:26
Done.
| |
859 UNSUPPORTED_OPERATOR(node); | |
860 } | |
861 VisitRRFloat64(this, kArmVroundTruncateF64, node); | |
862 } | |
863 | |
864 | |
865 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { | |
866 if (!CpuFeatures::IsSupported(ARMv8)) { | |
Benedikt Meurer
2014/10/30 11:59:12
I think this should be DCHECK(CpuFeatures::IsSuppo
sigurds
2014/10/30 12:18:26
Done.
| |
867 UNSUPPORTED_OPERATOR(node); | |
868 } | |
869 VisitRRFloat64(this, kArmVroundTiesAwayF64, node); | |
870 } | |
871 | |
872 | |
829 void InstructionSelector::VisitCall(Node* node) { | 873 void InstructionSelector::VisitCall(Node* node) { |
830 ArmOperandGenerator g(this); | 874 ArmOperandGenerator g(this); |
831 CallDescriptor* descriptor = OpParameter<CallDescriptor*>(node); | 875 CallDescriptor* descriptor = OpParameter<CallDescriptor*>(node); |
832 | 876 |
833 FrameStateDescriptor* frame_state_descriptor = NULL; | 877 FrameStateDescriptor* frame_state_descriptor = NULL; |
834 if (descriptor->NeedsFrameState()) { | 878 if (descriptor->NeedsFrameState()) { |
835 frame_state_descriptor = | 879 frame_state_descriptor = |
836 GetFrameStateDescriptor(node->InputAt(descriptor->InputCount())); | 880 GetFrameStateDescriptor(node->InputAt(descriptor->InputCount())); |
837 } | 881 } |
838 | 882 |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1132 | 1176 |
1133 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { | 1177 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { |
1134 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); | 1178 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); |
1135 VisitFloat64Compare(this, node, &cont); | 1179 VisitFloat64Compare(this, node, &cont); |
1136 } | 1180 } |
1137 | 1181 |
1138 | 1182 |
1139 // static | 1183 // static |
1140 MachineOperatorBuilder::Flags | 1184 MachineOperatorBuilder::Flags |
1141 InstructionSelector::SupportedMachineOperatorFlags() { | 1185 InstructionSelector::SupportedMachineOperatorFlags() { |
1142 return MachineOperatorBuilder::kInt32DivIsSafe | | 1186 MachineOperatorBuilder::Flags flags = |
1143 MachineOperatorBuilder::kInt32ModIsSafe | | 1187 MachineOperatorBuilder::kInt32DivIsSafe | |
1144 MachineOperatorBuilder::kUint32DivIsSafe | | 1188 MachineOperatorBuilder::kInt32ModIsSafe | |
1145 MachineOperatorBuilder::kUint32ModIsSafe; | 1189 MachineOperatorBuilder::kUint32DivIsSafe | |
1190 MachineOperatorBuilder::kUint32ModIsSafe; | |
1191 | |
1192 if (CpuFeatures::IsSupported(ARMv8)) { | |
1193 flags |= MachineOperatorBuilder::kFloat64Floor | | |
1194 MachineOperatorBuilder::kFloat64Ceil | | |
1195 MachineOperatorBuilder::kFloat64RoundTruncate | | |
1196 MachineOperatorBuilder::kFloat64RoundTiesAway; | |
1197 } | |
1198 return flags; | |
1146 } | 1199 } |
1147 | 1200 |
1148 } // namespace compiler | 1201 } // namespace compiler |
1149 } // namespace internal | 1202 } // namespace internal |
1150 } // namespace v8 | 1203 } // namespace v8 |
OLD | NEW |