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

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: Fixes and more 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
« no previous file with comments | « runtime/vm/assembler_x64.cc ('k') | runtime/vm/constants_x64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
1257 __ movss(Address(R15, 0), XMM2); 1265 __ movss(Address(R15, 0), XMM2);
1258 __ movss(XMM3, Address(R15, 0)); 1266 __ movss(XMM3, Address(R15, 0));
1259 __ movq(RAX, RSP); 1267 __ movq(RAX, RSP);
1260 __ movss(Address(RAX, 0), XMM3); 1268 __ movss(Address(RAX, 0), XMM3);
1261 __ movss(XMM4, Address(RAX, 0)); 1269 __ movss(XMM1, Address(RAX, 0));
1262 __ movss(XMM0, Address(RAX, 0)); 1270 __ movss(XMM15, Address(RAX, 0));
1271 __ movss(XMM14, XMM15);
1272 __ movss(XMM13, XMM14);
1273 __ movss(XMM12, XMM13);
1274 __ movss(XMM11, XMM12);
1275 __ movss(XMM10, XMM11);
1276 __ movss(XMM9, XMM10);
1277 __ movss(XMM8, XMM9);
1278 __ movss(XMM7, XMM8);
1279 __ movss(XMM6, XMM7);
1280 __ movss(XMM5, XMM6);
1281 __ movss(XMM4, XMM5);
1282 __ movss(XMM3, XMM4);
1283 __ movss(XMM2, XMM3);
1284 __ movss(XMM1, XMM2);
1285 __ movss(XMM0, XMM1);
1263 __ popq(RAX); 1286 __ popq(RAX);
1264 __ popq(R15); // Callee saved. 1287 __ popq(R15); // Callee saved.
1265 __ ret(); 1288 __ ret();
1266 } 1289 }
1267 1290
1268 1291
1269 ASSEMBLER_TEST_RUN(SingleFPMoves, entry) { 1292 ASSEMBLER_TEST_RUN(SingleFPMoves, entry) {
1270 typedef float (*SingleFPMovesCode)(); 1293 typedef float (*SingleFPMovesCode)();
1271 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(entry)()); 1294 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(entry)());
1272 } 1295 }
1273 1296
1274 1297
1275 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) { 1298 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) {
1276 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); 1299 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f)));
1277 __ movd(XMM0, RAX); 1300 __ movd(XMM0, RAX);
1278 __ movss(XMM1, XMM0); 1301 __ movd(XMM8, RAX);
1302 __ movss(XMM1, XMM8);
1279 __ pushq(RAX); 1303 __ pushq(RAX);
1280 __ movq(Address(RSP, 0), Immediate(0)); 1304 __ movq(Address(RSP, 0), Immediate(0));
1281 __ movss(XMM0, Address(RSP, 0)); 1305 __ movss(XMM0, Address(RSP, 0));
1282 __ movss(Address(RSP, 0), XMM1); 1306 __ movss(Address(RSP, 0), XMM1);
1283 __ movss(XMM0, Address(RSP, 0)); 1307 __ movss(XMM0, Address(RSP, 0));
1308 __ movq(Address(RSP, 0), Immediate(0));
1309 __ movss(XMM9, XMM8);
1310 __ movss(Address(RSP, 0), XMM9);
1311 __ movss(XMM8, Address(RSP, 0));
1312 __ movss(XMM0, XMM8);
1284 __ popq(RAX); 1313 __ popq(RAX);
1285 __ ret(); 1314 __ ret();
1286 } 1315 }
1287 1316
1288 1317
1289 ASSEMBLER_TEST_RUN(SingleFPMoves2, entry) { 1318 ASSEMBLER_TEST_RUN(SingleFPMoves2, entry) {
1290 typedef float (*SingleFPMoves2Code)(); 1319 typedef float (*SingleFPMoves2Code)();
1291 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(entry)()); 1320 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(entry)());
1292 } 1321 }
1293 1322
1294 1323
1295 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) { 1324 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) {
1296 __ pushq(RBX); 1325 __ pushq(RBX);
1297 __ pushq(RCX); 1326 __ pushq(RCX);
1298 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f))); 1327 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f)));
1299 __ movd(XMM0, RBX); 1328 __ movd(XMM0, RBX);
1329 __ movd(XMM8, RBX);
1300 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f))); 1330 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f)));
1301 __ movd(XMM1, RCX); 1331 __ movd(XMM1, RCX);
1332 __ movd(XMM9, RCX);
1302 __ addss(XMM0, XMM1); // 15.7f 1333 __ addss(XMM0, XMM1); // 15.7f
1303 __ mulss(XMM0, XMM1); // 53.38f 1334 __ mulss(XMM0, XMM1); // 53.38f
1304 __ subss(XMM0, XMM1); // 49.98f 1335 __ subss(XMM0, XMM1); // 49.98f
1305 __ divss(XMM0, XMM1); // 14.7f 1336 __ divss(XMM0, XMM1); // 14.7f
1337 __ addss(XMM8, XMM9); // 15.7f
1338 __ mulss(XMM8, XMM9); // 53.38f
1339 __ subss(XMM8, XMM9); // 49.98f
1340 __ divss(XMM8, XMM9); // 14.7f
1341 __ subss(XMM0, XMM8); // 0.0f
1306 __ popq(RCX); 1342 __ popq(RCX);
1307 __ popq(RBX); 1343 __ popq(RBX);
1308 __ ret(); 1344 __ ret();
1309 } 1345 }
1310 1346
1311 1347
1312 ASSEMBLER_TEST_RUN(SingleFPOperations, entry) { 1348 ASSEMBLER_TEST_RUN(SingleFPOperations, entry) {
1313 typedef float (*SingleFPOperationsCode)(); 1349 typedef float (*SingleFPOperationsCode)();
1314 float res = reinterpret_cast<SingleFPOperationsCode>(entry)(); 1350 float res = reinterpret_cast<SingleFPOperationsCode>(entry)();
1315 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); 1351 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
1316 } 1352 }
1317 1353
1318 1354
1319 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) { 1355 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) {
1320 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67))); 1356 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67)));
1321 __ pushq(R15); // Callee saved. 1357 __ pushq(R15); // Callee saved.
1322 __ pushq(RAX); 1358 __ pushq(RAX);
1323 __ movsd(XMM0, Address(RSP, 0)); 1359 __ movsd(XMM0, Address(RSP, 0));
1324 __ movsd(XMM1, XMM0); 1360 __ movsd(XMM1, XMM0);
1325 __ movsd(XMM2, XMM1); 1361 __ movsd(XMM2, XMM1);
1326 __ movsd(XMM3, XMM2); 1362 __ movsd(XMM3, XMM2);
1327 __ movsd(XMM4, XMM3); 1363 __ movsd(XMM4, XMM3);
1328 __ movsd(XMM5, XMM4); 1364 __ movsd(XMM5, XMM4);
1329 __ movsd(XMM6, XMM5); 1365 __ movsd(XMM6, XMM5);
1330 __ movsd(XMM7, XMM6); 1366 __ movsd(XMM7, XMM6);
1367 __ movsd(XMM8, XMM7);
1368 __ movsd(XMM9, XMM8);
1369 __ movsd(XMM10, XMM9);
1370 __ movsd(XMM11, XMM10);
1371 __ movsd(XMM12, XMM11);
1372 __ movsd(XMM13, XMM12);
1373 __ movsd(XMM14, XMM13);
1374 __ movsd(XMM15, XMM14);
1331 __ movq(Address(RSP, 0), Immediate(0)); 1375 __ movq(Address(RSP, 0), Immediate(0));
1332 __ movsd(XMM0, Address(RSP, 0)); 1376 __ movsd(XMM0, Address(RSP, 0));
1333 __ movsd(Address(RSP, 0), XMM7); 1377 __ movsd(Address(RSP, 0), XMM15);
1334 __ movsd(XMM1, Address(RSP, 0)); 1378 __ movsd(XMM1, Address(RSP, 0));
1335 __ movq(R10, RSP); 1379 __ movq(R10, RSP);
1336 __ movsd(Address(R10, 0), XMM1); 1380 __ movsd(Address(R10, 0), XMM1);
1337 __ movsd(XMM2, Address(R10, 0)); 1381 __ movsd(XMM2, Address(R10, 0));
1338 __ movq(R15, RSP); 1382 __ movq(R15, RSP);
1339 __ movsd(Address(R15, 0), XMM2); 1383 __ movsd(Address(R15, 0), XMM2);
1340 __ movsd(XMM3, Address(R15, 0)); 1384 __ movsd(XMM3, Address(R15, 0));
1341 __ movq(RAX, RSP); 1385 __ movq(RAX, RSP);
1342 __ movsd(Address(RAX, 0), XMM3); 1386 __ movsd(Address(RAX, 0), XMM3);
1343 __ movsd(XMM4, Address(RAX, 0)); 1387 __ movsd(XMM4, Address(RAX, 0));
1344 __ movsd(XMM7, Address(RSP, 0)); 1388 __ movsd(XMM15, Address(RSP, 0));
1389 __ movaps(XMM14, XMM15);
1390 __ movaps(XMM13, XMM14);
1391 __ movaps(XMM12, XMM13);
1392 __ movaps(XMM11, XMM12);
1393 __ movaps(XMM10, XMM11);
1394 __ movaps(XMM9, XMM10);
1395 __ movaps(XMM8, XMM9);
1396 __ movaps(XMM7, XMM8);
1345 __ movaps(XMM6, XMM7); 1397 __ movaps(XMM6, XMM7);
1346 __ movaps(XMM5, XMM6); 1398 __ movaps(XMM5, XMM6);
1347 __ movaps(XMM4, XMM5); 1399 __ movaps(XMM4, XMM5);
1348 __ movaps(XMM3, XMM4); 1400 __ movaps(XMM3, XMM4);
1349 __ movaps(XMM2, XMM3); 1401 __ movaps(XMM2, XMM3);
1350 __ movaps(XMM1, XMM2); 1402 __ movaps(XMM1, XMM2);
1351 __ movaps(XMM0, XMM1); 1403 __ movaps(XMM0, XMM1);
1352 __ popq(RAX); 1404 __ popq(RAX);
1353 __ popq(R15); // Callee saved. 1405 __ popq(R15); // Callee saved.
1354 __ ret(); 1406 __ ret();
1355 } 1407 }
1356 1408
1357 1409
1358 ASSEMBLER_TEST_RUN(DoubleFPMoves, entry) { 1410 ASSEMBLER_TEST_RUN(DoubleFPMoves, entry) {
1359 typedef double (*DoubleFPMovesCode)(); 1411 typedef double (*DoubleFPMovesCode)();
1360 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(entry)(), 0.001); 1412 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(entry)(), 0.001);
1361 } 1413 }
1362 1414
1363 1415
1364 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { 1416 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) {
1365 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); 1417 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
1366 __ pushq(RAX); 1418 __ pushq(RAX);
1367 __ movsd(XMM0, Address(RSP, 0)); 1419 __ movsd(XMM0, Address(RSP, 0));
1420 __ movsd(XMM8, Address(RSP, 0));
1368 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4))); 1421 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4)));
1369 __ movq(Address(RSP, 0), RAX); 1422 __ movq(Address(RSP, 0), RAX);
1423 __ movsd(XMM12, Address(RSP, 0));
1424 __ addsd(XMM8, XMM12); // 15.7
1425 __ mulsd(XMM8, XMM12); // 53.38
1426 __ subsd(XMM8, XMM12); // 49.98
1427 __ divsd(XMM8, XMM12); // 14.7
1428 __ sqrtsd(XMM8, XMM8); // 3.834
1370 __ movsd(XMM1, Address(RSP, 0)); 1429 __ movsd(XMM1, Address(RSP, 0));
1371 __ addsd(XMM0, XMM1); // 15.7 1430 __ addsd(XMM0, XMM1); // 15.7
1372 __ mulsd(XMM0, XMM1); // 53.38 1431 __ mulsd(XMM0, XMM1); // 53.38
1373 __ subsd(XMM0, XMM1); // 49.98 1432 __ subsd(XMM0, XMM1); // 49.98
1374 __ divsd(XMM0, XMM1); // 14.7 1433 __ divsd(XMM0, XMM1); // 14.7
1434 __ sqrtsd(XMM0, XMM0); // 3.834057902
1435 __ addsd(XMM0, XMM8); // 7.6681
1375 __ popq(RAX); 1436 __ popq(RAX);
1376 __ ret(); 1437 __ ret();
1377 } 1438 }
1378 1439
1379 1440
1380 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) { 1441 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) {
1381 typedef double (*SingleFPOperationsCode)(); 1442 typedef double (*SingleFPOperationsCode)();
1382 double res = reinterpret_cast<SingleFPOperationsCode>(entry)(); 1443 double res = reinterpret_cast<SingleFPOperationsCode>(entry)();
1383 EXPECT_FLOAT_EQ(14.7, res, 0.001); 1444 EXPECT_FLOAT_EQ(7.668, res, 0.001);
1384 } 1445 }
1385 1446
1386 1447
1387 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) { 1448 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) {
1388 __ movl(RDX, Immediate(6)); 1449 __ movl(RDX, Immediate(6));
1389 __ cvtsi2sd(XMM0, RDX); 1450 __ cvtsi2sd(XMM0, RDX);
1451 __ movl(RDX, Immediate(8));
1452 __ cvtsi2sd(XMM8, RDX);
1453 __ subsd(XMM0, XMM8);
1390 __ ret(); 1454 __ ret();
1391 } 1455 }
1392 1456
1393 1457
1394 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, entry) { 1458 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, entry) {
1395 typedef double (*IntToDoubleConversionCode)(); 1459 typedef double (*IntToDoubleConversionCode)();
1396 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); 1460 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)();
1397 EXPECT_FLOAT_EQ(6.0, res, 0.001); 1461 EXPECT_FLOAT_EQ(-2.0, res, 0.001);
1398 } 1462 }
1399 1463
1400 1464
1401 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) { 1465 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) {
1402 __ movq(RDX, Immediate(12LL << 32)); 1466 __ movq(RDX, Immediate(12LL << 32));
1403 __ cvtsi2sd(XMM0, RDX); 1467 __ cvtsi2sd(XMM0, RDX);
1468 __ movsd(XMM15, XMM0); // Move to high register
1469 __ addsd(XMM0, XMM0); // Stomp XMM0
1470 __ movsd(XMM0, XMM15); // Move back to XMM0
1404 __ ret(); 1471 __ ret();
1405 } 1472 }
1406 1473
1407 1474
1408 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, entry) { 1475 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, entry) {
1409 typedef double (*Int64ToDoubleConversionCode)(); 1476 typedef double (*Int64ToDoubleConversionCode)();
1410 double res = reinterpret_cast<Int64ToDoubleConversionCode>(entry)(); 1477 double res = reinterpret_cast<Int64ToDoubleConversionCode>(entry)();
1411 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001); 1478 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001);
1412 } 1479 }
1413 1480
1414 1481
1415 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) { 1482 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) {
1416 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); 1483 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
1417 __ pushq(RAX); 1484 __ pushq(RAX);
1485 __ movsd(XMM9, Address(RSP, 0));
1418 __ movsd(XMM6, Address(RSP, 0)); 1486 __ movsd(XMM6, Address(RSP, 0));
1419 __ popq(RAX); 1487 __ popq(RAX);
1488 __ cvttsd2siq(R10, XMM6);
1420 __ cvttsd2siq(RDX, XMM6); 1489 __ cvttsd2siq(RDX, XMM6);
1490 __ cvttsd2siq(R10, XMM9);
1491 __ cvttsd2siq(RDX, XMM9);
1492 __ subq(RDX, R10);
1421 __ movq(RAX, RDX); 1493 __ movq(RAX, RDX);
1422 __ ret(); 1494 __ ret();
1423 } 1495 }
1424 1496
1425 1497
1426 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, entry) { 1498 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, entry) {
1427 typedef int64_t (*DoubleToInt64ConversionCode)(); 1499 typedef int64_t (*DoubleToInt64ConversionCode)();
1428 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(entry)(); 1500 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(entry)();
1429 EXPECT_EQ(12, res); 1501 EXPECT_EQ(0, res);
1430 } 1502 }
1431 1503
1432 1504
1433 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) { 1505 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) {
1434 ObjectStore* object_store = Isolate::Current()->object_store(); 1506 ObjectStore* object_store = Isolate::Current()->object_store();
1435 const Object& obj = Object::ZoneHandle(object_store->smi_class()); 1507 const Object& obj = Object::ZoneHandle(object_store->smi_class());
1436 Label fail; 1508 Label fail;
1437 __ LoadObject(RAX, obj); 1509 __ LoadObject(RAX, obj);
1438 __ CompareObject(RAX, obj); 1510 __ CompareObject(RAX, obj);
1439 __ j(NOT_EQUAL, &fail); 1511 __ j(NOT_EQUAL, &fail);
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 1670
1599 1671
1600 ASSEMBLER_TEST_RUN(XorpdZeroing, entry) { 1672 ASSEMBLER_TEST_RUN(XorpdZeroing, entry) {
1601 typedef double (*XorpdZeroingCode)(double d); 1673 typedef double (*XorpdZeroingCode)(double d);
1602 double res = reinterpret_cast<XorpdZeroingCode>(entry)(12.56e3); 1674 double res = reinterpret_cast<XorpdZeroingCode>(entry)(12.56e3);
1603 EXPECT_FLOAT_EQ(0.0, res, 0.0001); 1675 EXPECT_FLOAT_EQ(0.0, res, 0.0001);
1604 } 1676 }
1605 1677
1606 1678
1607 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) { 1679 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) {
1680 Label done;
1681 __ xorpd(XMM15, XMM15);
1608 __ xorpd(XMM0, XMM0); 1682 __ xorpd(XMM0, XMM0);
1683 __ xorpd(XMM0, XMM15);
1684 __ comisd(XMM0, XMM15);
1685 __ j(ZERO, &done);
1686 __ int3();
1687 __ Bind(&done);
1609 __ ret(); 1688 __ ret();
1610 } 1689 }
1611 1690
1612 1691
1613 ASSEMBLER_TEST_RUN(XorpdZeroing2, entry) { 1692 ASSEMBLER_TEST_RUN(XorpdZeroing2, entry) {
1614 typedef double (*XorpdZeroing2Code)(double d); 1693 typedef double (*XorpdZeroing2Code)(double d);
1615 double res = reinterpret_cast<XorpdZeroing2Code>(entry)(12.56e3); 1694 double res = reinterpret_cast<XorpdZeroing2Code>(entry)(12.56e3);
1616 EXPECT_FLOAT_EQ(0.0, res, 0.0001); 1695 EXPECT_FLOAT_EQ(0.0, res, 0.0001);
1617 } 1696 }
1618 1697
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1746 EXPECT_EQ(0, res); 1825 EXPECT_EQ(0, res);
1747 res = reinterpret_cast<ExtractSignBits>(entry)(-1.0); 1826 res = reinterpret_cast<ExtractSignBits>(entry)(-1.0);
1748 EXPECT_EQ(1, res); 1827 EXPECT_EQ(1, res);
1749 res = reinterpret_cast<ExtractSignBits>(entry)(-0.0); 1828 res = reinterpret_cast<ExtractSignBits>(entry)(-0.0);
1750 EXPECT_EQ(1, res); 1829 EXPECT_EQ(1, res);
1751 } 1830 }
1752 1831
1753 } // namespace dart 1832 } // namespace dart
1754 1833
1755 #endif // defined TARGET_ARCH_X64 1834 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.cc ('k') | runtime/vm/constants_x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698