| 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 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1173 Stream s = m.Build(); | 1173 Stream s = m.Build(); |
| 1174 ASSERT_EQ(1U, s.size()); | 1174 ASSERT_EQ(1U, s.size()); |
| 1175 EXPECT_EQ(kMipsAbsD, s[0]->arch_opcode()); | 1175 EXPECT_EQ(kMipsAbsD, s[0]->arch_opcode()); |
| 1176 ASSERT_EQ(1U, s[0]->InputCount()); | 1176 ASSERT_EQ(1U, s[0]->InputCount()); |
| 1177 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 1177 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 1178 ASSERT_EQ(1U, s[0]->OutputCount()); | 1178 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 1179 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 1179 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 1180 } | 1180 } |
| 1181 | 1181 |
| 1182 TEST_F(InstructionSelectorTest, Float32AddWithFloat32Mul) { | 1182 TEST_F(InstructionSelectorTest, Float32AddWithFloat32Mul) { |
| 1183 if (!IsMipsArchVariant(kMips32r2) && !IsMipsArchVariant(kMips32r6)) { |
| 1184 return; |
| 1185 } |
| 1183 { | 1186 { |
| 1184 StreamBuilder m(this, MachineType::Float32(), MachineType::Float32(), | 1187 StreamBuilder m(this, MachineType::Float32(), MachineType::Float32(), |
| 1185 MachineType::Float32(), MachineType::Float32()); | 1188 MachineType::Float32(), MachineType::Float32()); |
| 1186 Node* const p0 = m.Parameter(0); | 1189 Node* const p0 = m.Parameter(0); |
| 1187 Node* const p1 = m.Parameter(1); | 1190 Node* const p1 = m.Parameter(1); |
| 1188 Node* const p2 = m.Parameter(2); | 1191 Node* const p2 = m.Parameter(2); |
| 1189 Node* const n = m.Float32Add(m.Float32Mul(p0, p1), p2); | 1192 Node* const n = m.Float32Add(m.Float32Mul(p0, p1), p2); |
| 1190 m.Return(n); | 1193 m.Return(n); |
| 1191 Stream s = m.Build(); | 1194 Stream s = m.Build(); |
| 1192 ASSERT_EQ(1U, s.size()); | 1195 ASSERT_EQ(1U, s.size()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1236 } else if (IsMipsArchVariant(kMips32r6)) { | 1239 } else if (IsMipsArchVariant(kMips32r6)) { |
| 1237 EXPECT_TRUE( | 1240 EXPECT_TRUE( |
| 1238 UnallocatedOperand::cast(s[0]->Output())->HasSameAsInputPolicy()); | 1241 UnallocatedOperand::cast(s[0]->Output())->HasSameAsInputPolicy()); |
| 1239 } | 1242 } |
| 1240 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 1243 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 1241 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); | 1244 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); |
| 1242 } | 1245 } |
| 1243 } | 1246 } |
| 1244 | 1247 |
| 1245 TEST_F(InstructionSelectorTest, Float64AddWithFloat64Mul) { | 1248 TEST_F(InstructionSelectorTest, Float64AddWithFloat64Mul) { |
| 1249 if (!IsMipsArchVariant(kMips32r2) && !IsMipsArchVariant(kMips32r6)) { |
| 1250 return; |
| 1251 } |
| 1246 { | 1252 { |
| 1247 StreamBuilder m(this, MachineType::Float64(), MachineType::Float64(), | 1253 StreamBuilder m(this, MachineType::Float64(), MachineType::Float64(), |
| 1248 MachineType::Float64(), MachineType::Float64()); | 1254 MachineType::Float64(), MachineType::Float64()); |
| 1249 Node* const p0 = m.Parameter(0); | 1255 Node* const p0 = m.Parameter(0); |
| 1250 Node* const p1 = m.Parameter(1); | 1256 Node* const p1 = m.Parameter(1); |
| 1251 Node* const p2 = m.Parameter(2); | 1257 Node* const p2 = m.Parameter(2); |
| 1252 Node* const n = m.Float64Add(m.Float64Mul(p0, p1), p2); | 1258 Node* const n = m.Float64Add(m.Float64Mul(p0, p1), p2); |
| 1253 m.Return(n); | 1259 m.Return(n); |
| 1254 Stream s = m.Build(); | 1260 Stream s = m.Build(); |
| 1255 ASSERT_EQ(1U, s.size()); | 1261 ASSERT_EQ(1U, s.size()); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1304 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); | 1310 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); |
| 1305 } | 1311 } |
| 1306 } | 1312 } |
| 1307 | 1313 |
| 1308 TEST_F(InstructionSelectorTest, Float32SubWithFloat32Mul) { | 1314 TEST_F(InstructionSelectorTest, Float32SubWithFloat32Mul) { |
| 1309 StreamBuilder m(this, MachineType::Float32(), MachineType::Float32(), | 1315 StreamBuilder m(this, MachineType::Float32(), MachineType::Float32(), |
| 1310 MachineType::Float32(), MachineType::Float32()); | 1316 MachineType::Float32(), MachineType::Float32()); |
| 1311 Node* const p0 = m.Parameter(0); | 1317 Node* const p0 = m.Parameter(0); |
| 1312 Node* const p1 = m.Parameter(1); | 1318 Node* const p1 = m.Parameter(1); |
| 1313 Node* const p2 = m.Parameter(2); | 1319 Node* const p2 = m.Parameter(2); |
| 1314 Node* n; | 1320 Node* n = nullptr; |
| 1321 |
| 1322 if (!IsMipsArchVariant(kMips32r2) && !IsMipsArchVariant(kMips32r6)) { |
| 1323 return; |
| 1324 } |
| 1325 |
| 1315 if (IsMipsArchVariant(kMips32r2)) { | 1326 if (IsMipsArchVariant(kMips32r2)) { |
| 1316 n = m.Float32Sub(m.Float32Mul(p1, p2), p0); | 1327 n = m.Float32Sub(m.Float32Mul(p1, p2), p0); |
| 1317 } else if (IsMipsArchVariant(kMips32r6)) { | 1328 } else if (IsMipsArchVariant(kMips32r6)) { |
| 1318 n = m.Float32Sub(p0, m.Float32Mul(p1, p2)); | 1329 n = m.Float32Sub(p0, m.Float32Mul(p1, p2)); |
| 1319 } | 1330 } |
| 1320 m.Return(n); | 1331 m.Return(n); |
| 1321 Stream s = m.Build(); | 1332 Stream s = m.Build(); |
| 1322 ASSERT_EQ(1U, s.size()); | 1333 ASSERT_EQ(1U, s.size()); |
| 1323 if (IsMipsArchVariant(kMips32r2)) { | 1334 if (IsMipsArchVariant(kMips32r2)) { |
| 1324 EXPECT_EQ(kMipsMsubS, s[0]->arch_opcode()); | 1335 EXPECT_EQ(kMipsMsubS, s[0]->arch_opcode()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1340 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 1351 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 1341 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); | 1352 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); |
| 1342 } | 1353 } |
| 1343 | 1354 |
| 1344 TEST_F(InstructionSelectorTest, Float64SubWithFloat64Mul) { | 1355 TEST_F(InstructionSelectorTest, Float64SubWithFloat64Mul) { |
| 1345 StreamBuilder m(this, MachineType::Float64(), MachineType::Float64(), | 1356 StreamBuilder m(this, MachineType::Float64(), MachineType::Float64(), |
| 1346 MachineType::Float64(), MachineType::Float64()); | 1357 MachineType::Float64(), MachineType::Float64()); |
| 1347 Node* const p0 = m.Parameter(0); | 1358 Node* const p0 = m.Parameter(0); |
| 1348 Node* const p1 = m.Parameter(1); | 1359 Node* const p1 = m.Parameter(1); |
| 1349 Node* const p2 = m.Parameter(2); | 1360 Node* const p2 = m.Parameter(2); |
| 1350 Node* n; | 1361 Node* n = nullptr; |
| 1362 |
| 1363 if (!IsMipsArchVariant(kMips32r2) && !IsMipsArchVariant(kMips32r6)) { |
| 1364 return; |
| 1365 } |
| 1366 |
| 1351 if (IsMipsArchVariant(kMips32r2)) { | 1367 if (IsMipsArchVariant(kMips32r2)) { |
| 1352 n = m.Float64Sub(m.Float64Mul(p1, p2), p0); | 1368 n = m.Float64Sub(m.Float64Mul(p1, p2), p0); |
| 1353 } else if (IsMipsArchVariant(kMips32r6)) { | 1369 } else if (IsMipsArchVariant(kMips32r6)) { |
| 1354 n = m.Float64Sub(p0, m.Float64Mul(p1, p2)); | 1370 n = m.Float64Sub(p0, m.Float64Mul(p1, p2)); |
| 1355 } | 1371 } |
| 1356 m.Return(n); | 1372 m.Return(n); |
| 1357 Stream s = m.Build(); | 1373 Stream s = m.Build(); |
| 1358 ASSERT_EQ(1U, s.size()); | 1374 ASSERT_EQ(1U, s.size()); |
| 1359 if (IsMipsArchVariant(kMips32r2)) { | 1375 if (IsMipsArchVariant(kMips32r2)) { |
| 1360 EXPECT_EQ(kMipsMsubD, s[0]->arch_opcode()); | 1376 EXPECT_EQ(kMipsMsubD, s[0]->arch_opcode()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1404 ASSERT_EQ(1U, s.size()); | 1420 ASSERT_EQ(1U, s.size()); |
| 1405 EXPECT_EQ(kMipsFloat64Min, s[0]->arch_opcode()); | 1421 EXPECT_EQ(kMipsFloat64Min, s[0]->arch_opcode()); |
| 1406 ASSERT_EQ(2U, s[0]->InputCount()); | 1422 ASSERT_EQ(2U, s[0]->InputCount()); |
| 1407 ASSERT_EQ(1U, s[0]->OutputCount()); | 1423 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 1408 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 1424 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 1409 } | 1425 } |
| 1410 | 1426 |
| 1411 } // namespace compiler | 1427 } // namespace compiler |
| 1412 } // namespace internal | 1428 } // namespace internal |
| 1413 } // namespace v8 | 1429 } // namespace v8 |
| OLD | NEW |