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 DCHECK(CpuFeatures::IsSupported(ARMv8)); |
| 843 VisitRRFloat64(this, kArmVfloorF64, node); |
| 844 } |
| 845 |
| 846 |
| 847 void InstructionSelector::VisitFloat64Ceil(Node* node) { |
| 848 DCHECK(CpuFeatures::IsSupported(ARMv8)); |
| 849 VisitRRFloat64(this, kArmVceilF64, node); |
| 850 } |
| 851 |
| 852 |
| 853 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { |
| 854 DCHECK(CpuFeatures::IsSupported(ARMv8)); |
| 855 VisitRRFloat64(this, kArmVroundTruncateF64, node); |
| 856 } |
| 857 |
| 858 |
| 859 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { |
| 860 DCHECK(CpuFeatures::IsSupported(ARMv8)); |
| 861 VisitRRFloat64(this, kArmVroundTiesAwayF64, node); |
| 862 } |
| 863 |
| 864 |
829 void InstructionSelector::VisitCall(Node* node) { | 865 void InstructionSelector::VisitCall(Node* node) { |
830 ArmOperandGenerator g(this); | 866 ArmOperandGenerator g(this); |
831 CallDescriptor* descriptor = OpParameter<CallDescriptor*>(node); | 867 CallDescriptor* descriptor = OpParameter<CallDescriptor*>(node); |
832 | 868 |
833 FrameStateDescriptor* frame_state_descriptor = NULL; | 869 FrameStateDescriptor* frame_state_descriptor = NULL; |
834 if (descriptor->NeedsFrameState()) { | 870 if (descriptor->NeedsFrameState()) { |
835 frame_state_descriptor = | 871 frame_state_descriptor = |
836 GetFrameStateDescriptor(node->InputAt(descriptor->InputCount())); | 872 GetFrameStateDescriptor(node->InputAt(descriptor->InputCount())); |
837 } | 873 } |
838 | 874 |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 | 1168 |
1133 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { | 1169 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { |
1134 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); | 1170 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); |
1135 VisitFloat64Compare(this, node, &cont); | 1171 VisitFloat64Compare(this, node, &cont); |
1136 } | 1172 } |
1137 | 1173 |
1138 | 1174 |
1139 // static | 1175 // static |
1140 MachineOperatorBuilder::Flags | 1176 MachineOperatorBuilder::Flags |
1141 InstructionSelector::SupportedMachineOperatorFlags() { | 1177 InstructionSelector::SupportedMachineOperatorFlags() { |
1142 return MachineOperatorBuilder::kInt32DivIsSafe | | 1178 MachineOperatorBuilder::Flags flags = |
1143 MachineOperatorBuilder::kInt32ModIsSafe | | 1179 MachineOperatorBuilder::kInt32DivIsSafe | |
1144 MachineOperatorBuilder::kUint32DivIsSafe | | 1180 MachineOperatorBuilder::kInt32ModIsSafe | |
1145 MachineOperatorBuilder::kUint32ModIsSafe; | 1181 MachineOperatorBuilder::kUint32DivIsSafe | |
| 1182 MachineOperatorBuilder::kUint32ModIsSafe; |
| 1183 |
| 1184 if (CpuFeatures::IsSupported(ARMv8)) { |
| 1185 flags |= MachineOperatorBuilder::kFloat64Floor | |
| 1186 MachineOperatorBuilder::kFloat64Ceil | |
| 1187 MachineOperatorBuilder::kFloat64RoundTruncate | |
| 1188 MachineOperatorBuilder::kFloat64RoundTiesAway; |
| 1189 } |
| 1190 return flags; |
1146 } | 1191 } |
1147 | 1192 |
1148 } // namespace compiler | 1193 } // namespace compiler |
1149 } // namespace internal | 1194 } // namespace internal |
1150 } // namespace v8 | 1195 } // namespace v8 |
OLD | NEW |