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 |