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/base/bits.h" | 6 #include "src/base/bits.h" |
7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 | 10 |
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 return; | 830 return; |
831 case IrOpcode::kFloat64RoundTiesEven: | 831 case IrOpcode::kFloat64RoundTiesEven: |
832 Emit(kMips64RoundWD, g.DefineAsRegister(node), | 832 Emit(kMips64RoundWD, g.DefineAsRegister(node), |
833 g.UseRegister(value->InputAt(0))); | 833 g.UseRegister(value->InputAt(0))); |
834 return; | 834 return; |
835 case IrOpcode::kFloat64RoundTruncate: | 835 case IrOpcode::kFloat64RoundTruncate: |
836 Emit(kMips64TruncWD, g.DefineAsRegister(node), | 836 Emit(kMips64TruncWD, g.DefineAsRegister(node), |
837 g.UseRegister(value->InputAt(0))); | 837 g.UseRegister(value->InputAt(0))); |
838 return; | 838 return; |
839 default: | 839 default: |
840 VisitRR(this, kMips64TruncWD, node); | 840 break; |
| 841 } |
| 842 if (value->opcode() == IrOpcode::kChangeFloat32ToFloat64) { |
| 843 Node* next = value->InputAt(0); |
| 844 if (CanCover(value, next)) { |
| 845 // Match ChangeFloat64ToInt32(ChangeFloat32ToFloat64(Float64Round##OP)) |
| 846 switch (next->opcode()) { |
| 847 case IrOpcode::kFloat32RoundDown: |
| 848 Emit(kMips64FloorWS, g.DefineAsRegister(node), |
| 849 g.UseRegister(next->InputAt(0))); |
| 850 return; |
| 851 case IrOpcode::kFloat32RoundUp: |
| 852 Emit(kMips64CeilWS, g.DefineAsRegister(node), |
| 853 g.UseRegister(next->InputAt(0))); |
| 854 return; |
| 855 case IrOpcode::kFloat32RoundTiesEven: |
| 856 Emit(kMips64RoundWS, g.DefineAsRegister(node), |
| 857 g.UseRegister(next->InputAt(0))); |
| 858 return; |
| 859 case IrOpcode::kFloat32RoundTruncate: |
| 860 Emit(kMips64TruncWS, g.DefineAsRegister(node), |
| 861 g.UseRegister(next->InputAt(0))); |
| 862 return; |
| 863 default: |
| 864 Emit(kMips64TruncWS, g.DefineAsRegister(node), |
| 865 g.UseRegister(value->InputAt(0))); |
| 866 return; |
| 867 } |
| 868 } else { |
| 869 // Match float32 -> float64 -> int32 representation change path. |
| 870 Emit(kMips64TruncWS, g.DefineAsRegister(node), |
| 871 g.UseRegister(value->InputAt(0))); |
841 return; | 872 return; |
| 873 } |
842 } | 874 } |
843 } | 875 } |
844 VisitRR(this, kMips64TruncWD, node); | 876 VisitRR(this, kMips64TruncWD, node); |
845 } | 877 } |
846 | 878 |
847 | 879 |
848 void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { | 880 void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { |
849 VisitRR(this, kMips64TruncUwD, node); | 881 VisitRR(this, kMips64TruncUwD, node); |
850 } | 882 } |
851 | 883 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 default: | 958 default: |
927 break; | 959 break; |
928 } | 960 } |
929 } | 961 } |
930 Emit(kMips64Ext, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | 962 Emit(kMips64Ext, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), |
931 g.TempImmediate(0), g.TempImmediate(32)); | 963 g.TempImmediate(0), g.TempImmediate(32)); |
932 } | 964 } |
933 | 965 |
934 | 966 |
935 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { | 967 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { |
| 968 Mips64OperandGenerator g(this); |
| 969 Node* value = node->InputAt(0); |
| 970 // Match TruncateFloat64ToFloat32(ChangeInt32ToFloat64) to corresponding |
| 971 // instruction. |
| 972 if (CanCover(node, value) && |
| 973 value->opcode() == IrOpcode::kChangeInt32ToFloat64) { |
| 974 Emit(kMips64CvtSW, g.DefineAsRegister(node), |
| 975 g.UseRegister(value->InputAt(0))); |
| 976 return; |
| 977 } |
936 VisitRR(this, kMips64CvtSD, node); | 978 VisitRR(this, kMips64CvtSD, node); |
937 } | 979 } |
938 | 980 |
939 | 981 |
940 void InstructionSelector::VisitTruncateFloat64ToInt32(Node* node) { | 982 void InstructionSelector::VisitTruncateFloat64ToInt32(Node* node) { |
941 switch (TruncationModeOf(node->op())) { | 983 switch (TruncationModeOf(node->op())) { |
942 case TruncationMode::kJavaScript: | 984 case TruncationMode::kJavaScript: |
943 return VisitRR(this, kArchTruncateDoubleToI, node); | 985 return VisitRR(this, kArchTruncateDoubleToI, node); |
944 case TruncationMode::kRoundToZero: | 986 case TruncationMode::kRoundToZero: |
945 return VisitRR(this, kMips64TruncWD, node); | 987 return VisitRR(this, kMips64TruncWD, node); |
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1766 MachineOperatorBuilder::kFloat32RoundUp | | 1808 MachineOperatorBuilder::kFloat32RoundUp | |
1767 MachineOperatorBuilder::kFloat64RoundTruncate | | 1809 MachineOperatorBuilder::kFloat64RoundTruncate | |
1768 MachineOperatorBuilder::kFloat32RoundTruncate | | 1810 MachineOperatorBuilder::kFloat32RoundTruncate | |
1769 MachineOperatorBuilder::kFloat64RoundTiesEven | | 1811 MachineOperatorBuilder::kFloat64RoundTiesEven | |
1770 MachineOperatorBuilder::kFloat32RoundTiesEven; | 1812 MachineOperatorBuilder::kFloat32RoundTiesEven; |
1771 } | 1813 } |
1772 | 1814 |
1773 } // namespace compiler | 1815 } // namespace compiler |
1774 } // namespace internal | 1816 } // namespace internal |
1775 } // namespace v8 | 1817 } // namespace v8 |
OLD | NEW |