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 "test/unittests/compiler/instruction-selector-unittest.h" | 5 #include "test/unittests/compiler/instruction-selector-unittest.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace compiler { | 9 namespace compiler { |
10 | 10 |
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
852 bool (InstructionSelectorTest::Stream::*val_predicate)( | 852 bool (InstructionSelectorTest::Stream::*val_predicate)( |
853 const InstructionOperand*) const; | 853 const InstructionOperand*) const; |
854 const int32_t immediates[5]; | 854 const int32_t immediates[5]; |
855 }; | 855 }; |
856 | 856 |
857 | 857 |
858 std::ostream& operator<<(std::ostream& os, const MemoryAccessImm1& acc) { | 858 std::ostream& operator<<(std::ostream& os, const MemoryAccessImm1& acc) { |
859 return os << acc.type; | 859 return os << acc.type; |
860 } | 860 } |
861 | 861 |
| 862 struct MemoryAccessImm2 { |
| 863 MachineType type; |
| 864 ArchOpcode store_opcode; |
| 865 ArchOpcode store_opcode_unaligned; |
| 866 bool (InstructionSelectorTest::Stream::*val_predicate)( |
| 867 const InstructionOperand*) const; |
| 868 const int32_t immediates[40]; |
| 869 }; |
| 870 |
| 871 std::ostream& operator<<(std::ostream& os, const MemoryAccessImm2& acc) { |
| 872 return os << acc.type; |
| 873 } |
862 | 874 |
863 // ---------------------------------------------------------------------------- | 875 // ---------------------------------------------------------------------------- |
864 // Loads and stores immediate values. | 876 // Loads and stores immediate values. |
865 // ---------------------------------------------------------------------------- | 877 // ---------------------------------------------------------------------------- |
866 | 878 |
867 | 879 |
868 const MemoryAccessImm kMemoryAccessesImm[] = { | 880 const MemoryAccessImm kMemoryAccessesImm[] = { |
869 {MachineType::Int8(), | 881 {MachineType::Int8(), |
870 kMipsLb, | 882 kMipsLb, |
871 kMipsSb, | 883 kMipsSb, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 kMipsLwc1, | 959 kMipsLwc1, |
948 kMipsSwc1, | 960 kMipsSwc1, |
949 &InstructionSelectorTest::Stream::IsDouble, | 961 &InstructionSelectorTest::Stream::IsDouble, |
950 {-65000, -55000, 32777, 55000, 65000}}, | 962 {-65000, -55000, 32777, 55000, 65000}}, |
951 {MachineType::Float64(), | 963 {MachineType::Float64(), |
952 kMipsLdc1, | 964 kMipsLdc1, |
953 kMipsSdc1, | 965 kMipsSdc1, |
954 &InstructionSelectorTest::Stream::IsDouble, | 966 &InstructionSelectorTest::Stream::IsDouble, |
955 {-65000, -55000, 32777, 55000, 65000}}}; | 967 {-65000, -55000, 32777, 55000, 65000}}}; |
956 | 968 |
| 969 const MemoryAccessImm2 kMemoryAccessesImmUnaligned[] = { |
| 970 {MachineType::Int16(), |
| 971 kMipsUsh, |
| 972 kMipsSh, |
| 973 &InstructionSelectorTest::Stream::IsInteger, |
| 974 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, |
| 975 -89, -87, -86, -82, -44, -23, -3, 0, 7, 10, |
| 976 39, 52, 69, 71, 91, 92, 107, 109, 115, 124, |
| 977 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, |
| 978 {MachineType::Int32(), |
| 979 kMipsUsw, |
| 980 kMipsSw, |
| 981 &InstructionSelectorTest::Stream::IsInteger, |
| 982 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, |
| 983 -89, -87, -86, -82, -44, -23, -3, 0, 7, 10, |
| 984 39, 52, 69, 71, 91, 92, 107, 109, 115, 124, |
| 985 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, |
| 986 {MachineType::Float32(), |
| 987 kMipsUswc1, |
| 988 kMipsSwc1, |
| 989 &InstructionSelectorTest::Stream::IsDouble, |
| 990 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, |
| 991 -89, -87, -86, -82, -44, -23, -3, 0, 7, 10, |
| 992 39, 52, 69, 71, 91, 92, 107, 109, 115, 124, |
| 993 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}, |
| 994 {MachineType::Float64(), |
| 995 kMipsUsdc1, |
| 996 kMipsSdc1, |
| 997 &InstructionSelectorTest::Stream::IsDouble, |
| 998 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, |
| 999 -89, -87, -86, -82, -44, -23, -3, 0, 7, 10, |
| 1000 39, 52, 69, 71, 91, 92, 107, 109, 115, 124, |
| 1001 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}}}; |
| 1002 |
957 } // namespace | 1003 } // namespace |
958 | 1004 |
959 | 1005 |
960 typedef InstructionSelectorTestWithParam<MemoryAccess> | 1006 typedef InstructionSelectorTestWithParam<MemoryAccess> |
961 InstructionSelectorMemoryAccessTest; | 1007 InstructionSelectorMemoryAccessTest; |
962 | 1008 |
963 | 1009 |
964 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) { | 1010 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) { |
965 const MemoryAccess memacc = GetParam(); | 1011 const MemoryAccess memacc = GetParam(); |
966 StreamBuilder m(this, memacc.type, MachineType::Pointer(), | 1012 StreamBuilder m(this, memacc.type, MachineType::Pointer(), |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1036 ASSERT_EQ(1U, s.size()); | 1082 ASSERT_EQ(1U, s.size()); |
1037 EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode()); | 1083 EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode()); |
1038 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); | 1084 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); |
1039 ASSERT_EQ(3U, s[0]->InputCount()); | 1085 ASSERT_EQ(3U, s[0]->InputCount()); |
1040 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); | 1086 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); |
1041 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); | 1087 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); |
1042 EXPECT_EQ(0U, s[0]->OutputCount()); | 1088 EXPECT_EQ(0U, s[0]->OutputCount()); |
1043 } | 1089 } |
1044 } | 1090 } |
1045 | 1091 |
| 1092 TEST_P(InstructionSelectorMemoryAccessImmTest, StoreZero) { |
| 1093 const MemoryAccessImm memacc = GetParam(); |
| 1094 TRACED_FOREACH(int32_t, index, memacc.immediates) { |
| 1095 StreamBuilder m(this, MachineType::Int32(), MachineType::Pointer()); |
| 1096 m.Store(memacc.type.representation(), m.Parameter(0), |
| 1097 m.Int32Constant(index), m.Int32Constant(0), kNoWriteBarrier); |
| 1098 m.Return(m.Int32Constant(0)); |
| 1099 Stream s = m.Build(); |
| 1100 ASSERT_EQ(1U, s.size()); |
| 1101 EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode()); |
| 1102 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); |
| 1103 ASSERT_EQ(3U, s[0]->InputCount()); |
| 1104 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); |
| 1105 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); |
| 1106 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(2)->kind()); |
| 1107 EXPECT_EQ(0, s.ToInt64(s[0]->InputAt(2))); |
| 1108 EXPECT_EQ(0U, s[0]->OutputCount()); |
| 1109 } |
| 1110 } |
1046 | 1111 |
1047 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, | 1112 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, |
1048 InstructionSelectorMemoryAccessImmTest, | 1113 InstructionSelectorMemoryAccessImmTest, |
1049 ::testing::ValuesIn(kMemoryAccessesImm)); | 1114 ::testing::ValuesIn(kMemoryAccessesImm)); |
1050 | 1115 |
| 1116 typedef InstructionSelectorTestWithParam<MemoryAccessImm2> |
| 1117 InstructionSelectorMemoryAccessUnalignedImmTest; |
| 1118 |
| 1119 TEST_P(InstructionSelectorMemoryAccessUnalignedImmTest, StoreZero) { |
| 1120 const MemoryAccessImm2 memacc = GetParam(); |
| 1121 TRACED_FOREACH(int32_t, index, memacc.immediates) { |
| 1122 StreamBuilder m(this, MachineType::Int32(), MachineType::Pointer()); |
| 1123 bool unaligned_store_supported = m.machine()->UnalignedStoreSupported( |
| 1124 MachineType::TypeForRepresentation(memacc.type.representation()), 1); |
| 1125 m.UnalignedStore(memacc.type.representation(), m.Parameter(0), |
| 1126 m.Int32Constant(index), m.Int32Constant(0)); |
| 1127 m.Return(m.Int32Constant(0)); |
| 1128 Stream s = m.Build(); |
| 1129 ASSERT_EQ(1U, s.size()); |
| 1130 EXPECT_EQ(unaligned_store_supported ? memacc.store_opcode_unaligned |
| 1131 : memacc.store_opcode, |
| 1132 s[0]->arch_opcode()); |
| 1133 EXPECT_EQ(kMode_MRI, s[0]->addressing_mode()); |
| 1134 ASSERT_EQ(3U, s[0]->InputCount()); |
| 1135 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind()); |
| 1136 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1))); |
| 1137 ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(2)->kind()); |
| 1138 EXPECT_EQ(0, s.ToInt64(s[0]->InputAt(2))); |
| 1139 EXPECT_EQ(0U, s[0]->OutputCount()); |
| 1140 } |
| 1141 } |
| 1142 |
| 1143 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, |
| 1144 InstructionSelectorMemoryAccessUnalignedImmTest, |
| 1145 ::testing::ValuesIn(kMemoryAccessesImmUnaligned)); |
1051 | 1146 |
1052 // ---------------------------------------------------------------------------- | 1147 // ---------------------------------------------------------------------------- |
1053 // Load/store offsets more than 16 bits. | 1148 // Load/store offsets more than 16 bits. |
1054 // ---------------------------------------------------------------------------- | 1149 // ---------------------------------------------------------------------------- |
1055 | 1150 |
1056 | 1151 |
1057 typedef InstructionSelectorTestWithParam<MemoryAccessImm1> | 1152 typedef InstructionSelectorTestWithParam<MemoryAccessImm1> |
1058 InstructionSelectorMemoryAccessImmMoreThan16bitTest; | 1153 InstructionSelectorMemoryAccessImmMoreThan16bitTest; |
1059 | 1154 |
1060 | 1155 |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1420 ASSERT_EQ(1U, s.size()); | 1515 ASSERT_EQ(1U, s.size()); |
1421 EXPECT_EQ(kMipsFloat64Min, s[0]->arch_opcode()); | 1516 EXPECT_EQ(kMipsFloat64Min, s[0]->arch_opcode()); |
1422 ASSERT_EQ(2U, s[0]->InputCount()); | 1517 ASSERT_EQ(2U, s[0]->InputCount()); |
1423 ASSERT_EQ(1U, s[0]->OutputCount()); | 1518 ASSERT_EQ(1U, s[0]->OutputCount()); |
1424 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 1519 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
1425 } | 1520 } |
1426 | 1521 |
1427 } // namespace compiler | 1522 } // namespace compiler |
1428 } // namespace internal | 1523 } // namespace internal |
1429 } // namespace v8 | 1524 } // namespace v8 |
OLD | NEW |