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 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 VisitRO(this, node, kSSEFloat32Sqrt); | 854 VisitRO(this, node, kSSEFloat32Sqrt); |
855 } | 855 } |
856 | 856 |
857 | 857 |
858 void InstructionSelector::VisitFloat64Sqrt(Node* node) { | 858 void InstructionSelector::VisitFloat64Sqrt(Node* node) { |
859 VisitRO(this, node, kSSEFloat64Sqrt); | 859 VisitRO(this, node, kSSEFloat64Sqrt); |
860 } | 860 } |
861 | 861 |
862 | 862 |
863 void InstructionSelector::VisitFloat32RoundDown(Node* node) { | 863 void InstructionSelector::VisitFloat32RoundDown(Node* node) { |
864 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundDown)); | 864 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 865 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundDown)); |
| 866 } else { |
| 867 IA32OperandGenerator g(this); |
| 868 InstructionOperand temps[] = {g.TempRegister()}; |
| 869 Emit(kSSEFloat32Round | MiscField::encode(kRoundDown), |
| 870 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 871 } |
865 } | 872 } |
866 | 873 |
867 | 874 |
868 void InstructionSelector::VisitFloat64RoundDown(Node* node) { | 875 void InstructionSelector::VisitFloat64RoundDown(Node* node) { |
869 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundDown)); | 876 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 877 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundDown)); |
| 878 } else { |
| 879 IA32OperandGenerator g(this); |
| 880 InstructionOperand temps[] = {g.TempRegister()}; |
| 881 Emit(kSSEFloat64Round | MiscField::encode(kRoundDown), |
| 882 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 883 } |
870 } | 884 } |
871 | 885 |
872 | 886 |
873 void InstructionSelector::VisitFloat32RoundUp(Node* node) { | 887 void InstructionSelector::VisitFloat32RoundUp(Node* node) { |
874 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundUp)); | 888 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 889 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundUp)); |
| 890 } else { |
| 891 IA32OperandGenerator g(this); |
| 892 InstructionOperand temps[] = {g.TempRegister()}; |
| 893 Emit(kSSEFloat32Round | MiscField::encode(kRoundUp), |
| 894 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 895 } |
875 } | 896 } |
876 | 897 |
877 | 898 |
878 void InstructionSelector::VisitFloat64RoundUp(Node* node) { | 899 void InstructionSelector::VisitFloat64RoundUp(Node* node) { |
879 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundUp)); | 900 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 901 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundUp)); |
| 902 } else { |
| 903 IA32OperandGenerator g(this); |
| 904 InstructionOperand temps[] = {g.TempRegister()}; |
| 905 Emit(kSSEFloat64Round | MiscField::encode(kRoundUp), |
| 906 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 907 } |
880 } | 908 } |
881 | 909 |
882 | 910 |
883 void InstructionSelector::VisitFloat32RoundTruncate(Node* node) { | 911 void InstructionSelector::VisitFloat32RoundTruncate(Node* node) { |
884 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToZero)); | 912 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 913 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToZero)); |
| 914 } else { |
| 915 IA32OperandGenerator g(this); |
| 916 InstructionOperand temps[] = {g.TempRegister()}; |
| 917 Emit(kSSEFloat32Round | MiscField::encode(kRoundToZero), |
| 918 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 919 } |
885 } | 920 } |
886 | 921 |
887 | 922 |
888 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { | 923 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { |
889 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToZero)); | 924 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 925 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToZero)); |
| 926 } else { |
| 927 IA32OperandGenerator g(this); |
| 928 InstructionOperand temps[] = {g.TempRegister()}; |
| 929 Emit(kSSEFloat64Round | MiscField::encode(kRoundToZero), |
| 930 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 931 } |
890 } | 932 } |
891 | 933 |
892 | 934 |
893 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { | 935 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { |
894 UNREACHABLE(); | 936 UNREACHABLE(); |
895 } | 937 } |
896 | 938 |
897 | 939 |
898 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) { | 940 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) { |
899 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToNearest)); | 941 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 942 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToNearest)); |
| 943 } else { |
| 944 IA32OperandGenerator g(this); |
| 945 InstructionOperand temps[] = {g.TempRegister()}; |
| 946 Emit(kSSEFloat32Round | MiscField::encode(kRoundToNearest), |
| 947 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 948 } |
900 } | 949 } |
901 | 950 |
902 | 951 |
903 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { | 952 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { |
904 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToNearest)); | 953 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 954 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToNearest)); |
| 955 } else { |
| 956 IA32OperandGenerator g(this); |
| 957 InstructionOperand temps[] = {g.TempRegister()}; |
| 958 Emit(kSSEFloat64Round | MiscField::encode(kRoundToNearest), |
| 959 g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 1, temps); |
| 960 } |
905 } | 961 } |
906 | 962 |
907 | 963 |
908 void InstructionSelector::EmitPrepareArguments( | 964 void InstructionSelector::EmitPrepareArguments( |
909 ZoneVector<PushParameter>* arguments, const CallDescriptor* descriptor, | 965 ZoneVector<PushParameter>* arguments, const CallDescriptor* descriptor, |
910 Node* node) { | 966 Node* node) { |
911 IA32OperandGenerator g(this); | 967 IA32OperandGenerator g(this); |
912 | 968 |
913 // Prepare for C function call. | 969 // Prepare for C function call. |
914 if (descriptor->IsCFunctionCall()) { | 970 if (descriptor->IsCFunctionCall()) { |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 | 1362 |
1307 // static | 1363 // static |
1308 MachineOperatorBuilder::Flags | 1364 MachineOperatorBuilder::Flags |
1309 InstructionSelector::SupportedMachineOperatorFlags() { | 1365 InstructionSelector::SupportedMachineOperatorFlags() { |
1310 MachineOperatorBuilder::Flags flags = | 1366 MachineOperatorBuilder::Flags flags = |
1311 MachineOperatorBuilder::kFloat32Max | | 1367 MachineOperatorBuilder::kFloat32Max | |
1312 MachineOperatorBuilder::kFloat32Min | | 1368 MachineOperatorBuilder::kFloat32Min | |
1313 MachineOperatorBuilder::kFloat64Max | | 1369 MachineOperatorBuilder::kFloat64Max | |
1314 MachineOperatorBuilder::kFloat64Min | | 1370 MachineOperatorBuilder::kFloat64Min | |
1315 MachineOperatorBuilder::kWord32ShiftIsSafe | | 1371 MachineOperatorBuilder::kWord32ShiftIsSafe | |
1316 MachineOperatorBuilder::kWord32Ctz; | 1372 MachineOperatorBuilder::kWord32Ctz | |
| 1373 MachineOperatorBuilder::kFloat32RoundDown | |
| 1374 MachineOperatorBuilder::kFloat32RoundUp | |
| 1375 MachineOperatorBuilder::kFloat32RoundTruncate | |
| 1376 MachineOperatorBuilder::kFloat32RoundTiesEven | |
| 1377 MachineOperatorBuilder::kFloat64RoundDown | |
| 1378 MachineOperatorBuilder::kFloat64RoundUp | |
| 1379 MachineOperatorBuilder::kFloat64RoundTruncate | |
| 1380 MachineOperatorBuilder::kFloat64RoundTiesEven; |
| 1381 |
1317 if (CpuFeatures::IsSupported(POPCNT)) { | 1382 if (CpuFeatures::IsSupported(POPCNT)) { |
1318 flags |= MachineOperatorBuilder::kWord32Popcnt; | 1383 flags |= MachineOperatorBuilder::kWord32Popcnt; |
1319 } | 1384 } |
1320 if (CpuFeatures::IsSupported(SSE4_1)) { | |
1321 flags |= MachineOperatorBuilder::kFloat32RoundDown | | |
1322 MachineOperatorBuilder::kFloat64RoundDown | | |
1323 MachineOperatorBuilder::kFloat32RoundUp | | |
1324 MachineOperatorBuilder::kFloat64RoundUp | | |
1325 MachineOperatorBuilder::kFloat32RoundTruncate | | |
1326 MachineOperatorBuilder::kFloat64RoundTruncate | | |
1327 MachineOperatorBuilder::kFloat32RoundTiesEven | | |
1328 MachineOperatorBuilder::kFloat64RoundTiesEven; | |
1329 } | |
1330 return flags; | 1385 return flags; |
1331 } | 1386 } |
1332 | 1387 |
1333 } // namespace compiler | 1388 } // namespace compiler |
1334 } // namespace internal | 1389 } // namespace internal |
1335 } // namespace v8 | 1390 } // namespace v8 |
OLD | NEW |