Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| (...skipping 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) { | 1237 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) { |
| 1238 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); | 1238 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); |
| 1239 __ movd(XMM0, RAX); | 1239 __ movd(XMM0, RAX); |
| 1240 __ movss(XMM1, XMM0); | 1240 __ movss(XMM1, XMM0); |
| 1241 __ movss(XMM2, XMM1); | 1241 __ movss(XMM2, XMM1); |
| 1242 __ movss(XMM3, XMM2); | 1242 __ movss(XMM3, XMM2); |
| 1243 __ movss(XMM4, XMM3); | 1243 __ movss(XMM4, XMM3); |
| 1244 __ movss(XMM5, XMM4); | 1244 __ movss(XMM5, XMM4); |
| 1245 __ movss(XMM6, XMM5); | 1245 __ movss(XMM6, XMM5); |
| 1246 __ movss(XMM7, XMM6); | 1246 __ movss(XMM7, XMM6); |
| 1247 __ movss(XMM8, XMM7); | |
| 1248 __ movss(XMM9, XMM8); | |
| 1249 __ movss(XMM10, XMM9); | |
| 1250 __ movss(XMM11, XMM10); | |
| 1251 __ movss(XMM12, XMM11); | |
| 1252 __ movss(XMM13, XMM12); | |
| 1253 __ movss(XMM14, XMM13); | |
| 1254 __ movss(XMM15, XMM14); | |
| 1247 __ pushq(R15); // Callee saved. | 1255 __ pushq(R15); // Callee saved. |
| 1248 __ pushq(RAX); | 1256 __ pushq(RAX); |
| 1249 __ movq(Address(RSP, 0), Immediate(0)); | 1257 __ movq(Address(RSP, 0), Immediate(0)); |
| 1250 __ movss(XMM0, Address(RSP, 0)); | 1258 __ movss(XMM0, Address(RSP, 0)); |
| 1251 __ movss(Address(RSP, 0), XMM7); | 1259 __ movss(Address(RSP, 0), XMM7); |
| 1252 __ movss(XMM1, Address(RSP, 0)); | 1260 __ movss(XMM1, Address(RSP, 0)); |
| 1253 __ movq(R10, RSP); | 1261 __ movq(R10, RSP); |
| 1254 __ movss(Address(R10, 0), XMM1); | 1262 __ movss(Address(R10, 0), XMM1); |
| 1255 __ movss(XMM2, Address(R10, 0)); | 1263 __ movss(XMM2, Address(R10, 0)); |
| 1256 __ movq(R15, RSP); | 1264 __ movq(R15, RSP); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1321 __ pushq(R15); // Callee saved. | 1329 __ pushq(R15); // Callee saved. |
| 1322 __ pushq(RAX); | 1330 __ pushq(RAX); |
| 1323 __ movsd(XMM0, Address(RSP, 0)); | 1331 __ movsd(XMM0, Address(RSP, 0)); |
| 1324 __ movsd(XMM1, XMM0); | 1332 __ movsd(XMM1, XMM0); |
| 1325 __ movsd(XMM2, XMM1); | 1333 __ movsd(XMM2, XMM1); |
| 1326 __ movsd(XMM3, XMM2); | 1334 __ movsd(XMM3, XMM2); |
| 1327 __ movsd(XMM4, XMM3); | 1335 __ movsd(XMM4, XMM3); |
| 1328 __ movsd(XMM5, XMM4); | 1336 __ movsd(XMM5, XMM4); |
| 1329 __ movsd(XMM6, XMM5); | 1337 __ movsd(XMM6, XMM5); |
| 1330 __ movsd(XMM7, XMM6); | 1338 __ movsd(XMM7, XMM6); |
| 1339 __ movsd(XMM8, XMM7); | |
| 1340 __ movsd(XMM9, XMM8); | |
| 1341 __ movsd(XMM10, XMM9); | |
| 1342 __ movsd(XMM11, XMM10); | |
| 1343 __ movsd(XMM12, XMM11); | |
| 1344 __ movsd(XMM13, XMM12); | |
| 1345 __ movsd(XMM14, XMM13); | |
| 1346 __ movsd(XMM15, XMM14); | |
| 1331 __ movq(Address(RSP, 0), Immediate(0)); | 1347 __ movq(Address(RSP, 0), Immediate(0)); |
| 1332 __ movsd(XMM0, Address(RSP, 0)); | 1348 __ movsd(XMM0, Address(RSP, 0)); |
| 1333 __ movsd(Address(RSP, 0), XMM7); | 1349 __ movsd(Address(RSP, 0), XMM15); |
| 1334 __ movsd(XMM1, Address(RSP, 0)); | 1350 __ movsd(XMM1, Address(RSP, 0)); |
| 1335 __ movq(R10, RSP); | 1351 __ movq(R10, RSP); |
| 1336 __ movsd(Address(R10, 0), XMM1); | 1352 __ movsd(Address(R10, 0), XMM1); |
| 1337 __ movsd(XMM2, Address(R10, 0)); | 1353 __ movsd(XMM2, Address(R10, 0)); |
| 1338 __ movq(R15, RSP); | 1354 __ movq(R15, RSP); |
| 1339 __ movsd(Address(R15, 0), XMM2); | 1355 __ movsd(Address(R15, 0), XMM2); |
| 1340 __ movsd(XMM3, Address(R15, 0)); | 1356 __ movsd(XMM3, Address(R15, 0)); |
| 1341 __ movq(RAX, RSP); | 1357 __ movq(RAX, RSP); |
| 1342 __ movsd(Address(RAX, 0), XMM3); | 1358 __ movsd(Address(RAX, 0), XMM3); |
| 1343 __ movsd(XMM4, Address(RAX, 0)); | 1359 __ movsd(XMM4, Address(RAX, 0)); |
| 1344 __ movsd(XMM7, Address(RSP, 0)); | 1360 __ movsd(XMM15, Address(RSP, 0)); |
| 1361 __ movaps(XMM14, XMM15); | |
| 1362 __ movaps(XMM13, XMM14); | |
| 1363 __ movaps(XMM12, XMM13); | |
| 1364 __ movaps(XMM11, XMM12); | |
| 1365 __ movaps(XMM10, XMM11); | |
| 1366 __ movaps(XMM9, XMM10); | |
| 1367 __ movaps(XMM8, XMM9); | |
| 1368 __ movaps(XMM7, XMM8); | |
| 1345 __ movaps(XMM6, XMM7); | 1369 __ movaps(XMM6, XMM7); |
| 1346 __ movaps(XMM5, XMM6); | 1370 __ movaps(XMM5, XMM6); |
| 1347 __ movaps(XMM4, XMM5); | 1371 __ movaps(XMM4, XMM5); |
| 1348 __ movaps(XMM3, XMM4); | 1372 __ movaps(XMM3, XMM4); |
| 1349 __ movaps(XMM2, XMM3); | 1373 __ movaps(XMM2, XMM3); |
| 1350 __ movaps(XMM1, XMM2); | 1374 __ movaps(XMM1, XMM2); |
| 1351 __ movaps(XMM0, XMM1); | 1375 __ movaps(XMM0, XMM1); |
| 1352 __ popq(RAX); | 1376 __ popq(RAX); |
| 1353 __ popq(R15); // Callee saved. | 1377 __ popq(R15); // Callee saved. |
| 1354 __ ret(); | 1378 __ ret(); |
| 1355 } | 1379 } |
| 1356 | 1380 |
| 1357 | 1381 |
| 1358 ASSEMBLER_TEST_RUN(DoubleFPMoves, entry) { | 1382 ASSEMBLER_TEST_RUN(DoubleFPMoves, entry) { |
| 1359 typedef double (*DoubleFPMovesCode)(); | 1383 typedef double (*DoubleFPMovesCode)(); |
| 1360 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(entry)(), 0.001); | 1384 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(entry)(), 0.001); |
| 1361 } | 1385 } |
| 1362 | 1386 |
| 1363 | 1387 |
| 1364 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { | 1388 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { |
| 1365 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); | 1389 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); |
| 1366 __ pushq(RAX); | 1390 __ pushq(RAX); |
| 1367 __ movsd(XMM0, Address(RSP, 0)); | 1391 __ movsd(XMM0, Address(RSP, 0)); |
| 1368 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4))); | 1392 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4))); |
| 1369 __ movq(Address(RSP, 0), RAX); | 1393 __ movq(Address(RSP, 0), RAX); |
| 1394 __ movsd(XMM12, Address(RSP, 0)); | |
| 1395 __ addsd(XMM8, XMM12); // 15.7 | |
| 1396 __ mulsd(XMM8, XMM12); // 53.38 | |
| 1397 __ subsd(XMM8, XMM12); // 49.98 | |
| 1398 __ divsd(XMM8, XMM12); // 14.7 | |
| 1399 __ sqrtsd(XMM8, XMM12); // 1.843 | |
|
Florian Schneider
2012/11/19 10:34:33
Maybe do sqrtsd(XMM8, XMM8) instead to include the
Cutch
2012/11/19 23:28:58
Done.
Cutch
2012/11/19 23:28:58
Done, I also add the XMM0 and XMM8 values together
| |
| 1370 __ movsd(XMM1, Address(RSP, 0)); | 1400 __ movsd(XMM1, Address(RSP, 0)); |
| 1371 __ addsd(XMM0, XMM1); // 15.7 | 1401 __ addsd(XMM0, XMM1); // 15.7 |
| 1372 __ mulsd(XMM0, XMM1); // 53.38 | 1402 __ mulsd(XMM0, XMM1); // 53.38 |
| 1373 __ subsd(XMM0, XMM1); // 49.98 | 1403 __ subsd(XMM0, XMM1); // 49.98 |
| 1374 __ divsd(XMM0, XMM1); // 14.7 | 1404 __ divsd(XMM0, XMM1); // 14.7 |
| 1405 __ sqrtsd(XMM0, XMM1); // 1.843 | |
|
Florian Schneider
2012/11/19 10:34:33
Maybe do sqrtsd(XMM0, XMM0) instead to include the
Cutch
2012/11/19 23:28:58
I add them together. I use the subtraction op else
| |
| 1375 __ popq(RAX); | 1406 __ popq(RAX); |
| 1376 __ ret(); | 1407 __ ret(); |
| 1377 } | 1408 } |
| 1378 | 1409 |
| 1379 | 1410 |
| 1380 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) { | 1411 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) { |
| 1381 typedef double (*SingleFPOperationsCode)(); | 1412 typedef double (*SingleFPOperationsCode)(); |
| 1382 double res = reinterpret_cast<SingleFPOperationsCode>(entry)(); | 1413 double res = reinterpret_cast<SingleFPOperationsCode>(entry)(); |
| 1383 EXPECT_FLOAT_EQ(14.7, res, 0.001); | 1414 EXPECT_FLOAT_EQ(1.843, res, 0.001); |
| 1384 } | 1415 } |
| 1385 | 1416 |
| 1386 | 1417 |
| 1387 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) { | 1418 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) { |
| 1388 __ movl(RDX, Immediate(6)); | 1419 __ movl(RDX, Immediate(6)); |
| 1389 __ cvtsi2sd(XMM0, RDX); | 1420 __ cvtsi2sd(XMM0, RDX); |
| 1390 __ ret(); | 1421 __ ret(); |
| 1391 } | 1422 } |
| 1392 | 1423 |
| 1393 | 1424 |
| 1394 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, entry) { | 1425 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, entry) { |
| 1395 typedef double (*IntToDoubleConversionCode)(); | 1426 typedef double (*IntToDoubleConversionCode)(); |
| 1396 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); | 1427 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); |
| 1397 EXPECT_FLOAT_EQ(6.0, res, 0.001); | 1428 EXPECT_FLOAT_EQ(6.0, res, 0.001); |
| 1398 } | 1429 } |
| 1399 | 1430 |
| 1400 | 1431 |
| 1401 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) { | 1432 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) { |
| 1402 __ movq(RDX, Immediate(12LL << 32)); | 1433 __ movq(RDX, Immediate(12LL << 32)); |
| 1403 __ cvtsi2sd(XMM0, RDX); | 1434 __ cvtsi2sd(XMM0, RDX); |
| 1435 __ movsd(XMM15, XMM0); // Move to high register | |
| 1436 __ addsd(XMM0, XMM0); // Stomp XMM0 | |
| 1437 __ movsd(XMM0, XMM15); // Move back to XMM0 | |
| 1404 __ ret(); | 1438 __ ret(); |
| 1405 } | 1439 } |
| 1406 | 1440 |
| 1407 | 1441 |
| 1408 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, entry) { | 1442 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, entry) { |
| 1409 typedef double (*Int64ToDoubleConversionCode)(); | 1443 typedef double (*Int64ToDoubleConversionCode)(); |
| 1410 double res = reinterpret_cast<Int64ToDoubleConversionCode>(entry)(); | 1444 double res = reinterpret_cast<Int64ToDoubleConversionCode>(entry)(); |
| 1411 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001); | 1445 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001); |
| 1412 } | 1446 } |
| 1413 | 1447 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1598 | 1632 |
| 1599 | 1633 |
| 1600 ASSEMBLER_TEST_RUN(XorpdZeroing, entry) { | 1634 ASSEMBLER_TEST_RUN(XorpdZeroing, entry) { |
| 1601 typedef double (*XorpdZeroingCode)(double d); | 1635 typedef double (*XorpdZeroingCode)(double d); |
| 1602 double res = reinterpret_cast<XorpdZeroingCode>(entry)(12.56e3); | 1636 double res = reinterpret_cast<XorpdZeroingCode>(entry)(12.56e3); |
| 1603 EXPECT_FLOAT_EQ(0.0, res, 0.0001); | 1637 EXPECT_FLOAT_EQ(0.0, res, 0.0001); |
| 1604 } | 1638 } |
| 1605 | 1639 |
| 1606 | 1640 |
| 1607 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) { | 1641 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) { |
| 1642 Label done; | |
| 1643 __ xorpd(XMM15, XMM15); | |
| 1608 __ xorpd(XMM0, XMM0); | 1644 __ xorpd(XMM0, XMM0); |
| 1645 __ xorpd(XMM0, XMM15); | |
| 1646 __ comisd(XMM0, XMM15); | |
| 1647 __ j(ZERO, &done); | |
| 1648 __ int3(); | |
| 1649 __ Bind(&done); | |
| 1609 __ ret(); | 1650 __ ret(); |
| 1610 } | 1651 } |
| 1611 | 1652 |
| 1612 | 1653 |
| 1613 ASSEMBLER_TEST_RUN(XorpdZeroing2, entry) { | 1654 ASSEMBLER_TEST_RUN(XorpdZeroing2, entry) { |
| 1614 typedef double (*XorpdZeroing2Code)(double d); | 1655 typedef double (*XorpdZeroing2Code)(double d); |
| 1615 double res = reinterpret_cast<XorpdZeroing2Code>(entry)(12.56e3); | 1656 double res = reinterpret_cast<XorpdZeroing2Code>(entry)(12.56e3); |
| 1616 EXPECT_FLOAT_EQ(0.0, res, 0.0001); | 1657 EXPECT_FLOAT_EQ(0.0, res, 0.0001); |
| 1617 } | 1658 } |
| 1618 | 1659 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1746 EXPECT_EQ(0, res); | 1787 EXPECT_EQ(0, res); |
| 1747 res = reinterpret_cast<ExtractSignBits>(entry)(-1.0); | 1788 res = reinterpret_cast<ExtractSignBits>(entry)(-1.0); |
| 1748 EXPECT_EQ(1, res); | 1789 EXPECT_EQ(1, res); |
| 1749 res = reinterpret_cast<ExtractSignBits>(entry)(-0.0); | 1790 res = reinterpret_cast<ExtractSignBits>(entry)(-0.0); |
| 1750 EXPECT_EQ(1, res); | 1791 EXPECT_EQ(1, res); |
| 1751 } | 1792 } |
| 1752 | 1793 |
| 1753 } // namespace dart | 1794 } // namespace dart |
| 1754 | 1795 |
| 1755 #endif // defined TARGET_ARCH_X64 | 1796 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |