Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(425)

Side by Side Diff: runtime/vm/assembler_x64_test.cc

Issue 11358262: Add support for XMM8..XMM15 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Merge Florian's CL and added some assembler tests. Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698