| 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 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 __ ret(); | 500 __ ret(); |
| 501 } | 501 } |
| 502 | 502 |
| 503 | 503 |
| 504 ASSEMBLER_TEST_RUN(SignedMultiply2, test) { | 504 ASSEMBLER_TEST_RUN(SignedMultiply2, test) { |
| 505 typedef int (*SignedMultiply2)(); | 505 typedef int (*SignedMultiply2)(); |
| 506 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(test->entry())()); | 506 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(test->entry())()); |
| 507 } | 507 } |
| 508 | 508 |
| 509 | 509 |
| 510 ASSEMBLER_TEST_GENERATE(UnsignedMultiplyLong, assembler) { |
| 511 __ movq(RAX, Immediate(-1)); // RAX = 0xFFFFFFFFFFFFFFFF |
| 512 __ movq(RCX, Immediate(16)); // RCX = 0x10 |
| 513 __ mulq(RCX); // RDX:RAX = RAX * RCX = 0x0FFFFFFFFFFFFFFFF0 |
| 514 __ movq(RAX, RDX); // Return high64(0x0FFFFFFFFFFFFFFFF0) == 0x0F |
| 515 __ ret(); |
| 516 } |
| 517 |
| 518 |
| 519 ASSEMBLER_TEST_RUN(UnsignedMultiplyLong, test) { |
| 520 typedef int64_t (*UnsignedMultiplyLong)(); |
| 521 EXPECT_EQ(15, reinterpret_cast<UnsignedMultiplyLong>(test->entry())()); |
| 522 } |
| 523 |
| 524 |
| 510 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) { | 525 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) { |
| 511 __ movl(RAX, Immediate(-87)); | 526 __ movl(RAX, Immediate(-87)); |
| 512 __ movl(RDX, Immediate(123)); | 527 __ movl(RDX, Immediate(123)); |
| 513 __ cdq(); | 528 __ cdq(); |
| 514 __ movl(RCX, Immediate(42)); | 529 __ movl(RCX, Immediate(42)); |
| 515 __ idivl(RCX); | 530 __ idivl(RCX); |
| 516 __ ret(); | 531 __ ret(); |
| 517 } | 532 } |
| 518 | 533 |
| 519 | 534 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 } | 567 } |
| 553 | 568 |
| 554 | 569 |
| 555 ASSEMBLER_TEST_RUN(SignedDivideLong, test) { | 570 ASSEMBLER_TEST_RUN(SignedDivideLong, test) { |
| 556 typedef int64_t (*SignedDivideLong)(); | 571 typedef int64_t (*SignedDivideLong)(); |
| 557 EXPECT_EQ(kLargeConstant / 42, | 572 EXPECT_EQ(kLargeConstant / 42, |
| 558 reinterpret_cast<SignedDivideLong>(test->entry())()); | 573 reinterpret_cast<SignedDivideLong>(test->entry())()); |
| 559 } | 574 } |
| 560 | 575 |
| 561 | 576 |
| 577 ASSEMBLER_TEST_GENERATE(UnsignedDivideLong, assembler) { |
| 578 const int64_t low = 0; |
| 579 const int64_t high = 0xf000000000000000; |
| 580 const int64_t divisor = 0xffffffffffffffff; |
| 581 __ movq(RAX, Immediate(low)); |
| 582 __ movq(RDX, Immediate(high)); |
| 583 __ movq(RCX, Immediate(divisor)); |
| 584 __ divq(RCX); // RAX = RDX:RAX / RCX = |
| 585 // = 0xf0000000000000000000000000000000 / |
| 586 // 0xffffffffffffffff = 0xf000000000000000 |
| 587 __ ret(); |
| 588 } |
| 589 |
| 590 |
| 591 ASSEMBLER_TEST_RUN(UnsignedDivideLong, test) { |
| 592 typedef uint64_t (*UnsignedDivideLong)(); |
| 593 EXPECT_EQ(0xf000000000000000, |
| 594 reinterpret_cast<UnsignedDivideLong>(test->entry())()); |
| 595 } |
| 596 |
| 597 |
| 562 ASSEMBLER_TEST_GENERATE(Negate, assembler) { | 598 ASSEMBLER_TEST_GENERATE(Negate, assembler) { |
| 563 __ movl(RCX, Immediate(42)); | 599 __ movl(RCX, Immediate(42)); |
| 564 __ negl(RCX); | 600 __ negl(RCX); |
| 565 __ movl(RAX, RCX); | 601 __ movl(RAX, RCX); |
| 566 __ ret(); | 602 __ ret(); |
| 567 } | 603 } |
| 568 | 604 |
| 569 | 605 |
| 570 ASSEMBLER_TEST_RUN(Negate, test) { | 606 ASSEMBLER_TEST_RUN(Negate, test) { |
| 571 typedef int (*Negate)(); | 607 typedef int (*Negate)(); |
| (...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1264 __ movl(RCX, Immediate(3)); | 1300 __ movl(RCX, Immediate(3)); |
| 1265 __ shlq(RAX, Immediate(31)); | 1301 __ shlq(RAX, Immediate(31)); |
| 1266 __ sarl(RAX, RCX); | 1302 __ sarl(RAX, RCX); |
| 1267 __ cmpl(RAX, Immediate(0xfffffffff0000000)); | 1303 __ cmpl(RAX, Immediate(0xfffffffff0000000)); |
| 1268 __ j(EQUAL, &donetest13a); | 1304 __ j(EQUAL, &donetest13a); |
| 1269 // Be sure to skip this crashing code. | 1305 // Be sure to skip this crashing code. |
| 1270 __ movl(RAX, Immediate(0)); | 1306 __ movl(RAX, Immediate(0)); |
| 1271 __ movl(Address(RAX, 0), RAX); | 1307 __ movl(Address(RAX, 0), RAX); |
| 1272 __ Bind(&donetest13a); | 1308 __ Bind(&donetest13a); |
| 1273 | 1309 |
| 1274 Label donetest15a; | 1310 { |
| 1275 const int32_t left = 0xff000000; | 1311 Label donetest15a; |
| 1276 const int32_t right = 0xffffffff; | 1312 const int32_t left = 0xff000000; |
| 1277 const int32_t shifted = 0xf0000003; | 1313 const int32_t right = 0xffffffff; |
| 1278 __ movl(RDX, Immediate(left)); | 1314 const int32_t shifted = 0xf0000003; |
| 1279 __ movl(RAX, Immediate(right)); | 1315 __ movl(RDX, Immediate(left)); |
| 1280 __ movl(RCX, Immediate(2)); | 1316 __ movl(RAX, Immediate(right)); |
| 1281 __ shll(RDX, RCX); // RDX = 0xff000000 << 2 == 0xfc000000 | 1317 __ movl(RCX, Immediate(2)); |
| 1282 __ shldl(RDX, RAX, Immediate(2)); // RDX = high32(0xfc000000:0xffffffff << 2) | 1318 __ shll(RDX, RCX); // RDX = 0xff000000 << 2 == 0xfc000000 |
| 1283 // = 0xf0000003 | 1319 __ shldl(RDX, RAX, Immediate(2)); |
| 1284 __ cmpl(RDX, Immediate(shifted)); | 1320 // RDX = high32(0xfc000000:0xffffffff << 2) == 0xf0000003 |
| 1285 __ j(EQUAL, &donetest15a); | 1321 __ cmpl(RDX, Immediate(shifted)); |
| 1286 __ int3(); | 1322 __ j(EQUAL, &donetest15a); |
| 1287 __ Bind(&donetest15a); | 1323 __ int3(); |
| 1324 __ Bind(&donetest15a); |
| 1325 } |
| 1326 |
| 1327 { |
| 1328 Label donetest15b; |
| 1329 const int64_t left = 0xff00000000000000; |
| 1330 const int64_t right = 0xffffffffffffffff; |
| 1331 const int64_t shifted = 0xf000000000000003; |
| 1332 __ movq(RDX, Immediate(left)); |
| 1333 __ movq(RAX, Immediate(right)); |
| 1334 __ movq(RCX, Immediate(2)); |
| 1335 __ shlq(RDX, RCX); // RDX = 0xff00000000000000 << 2 == 0xfc00000000000000 |
| 1336 __ shldq(RDX, RAX, Immediate(2)); |
| 1337 // RDX = high64(0xfc00000000000000:0xffffffffffffffff << 2) |
| 1338 // == 0xf000000000000003 |
| 1339 __ cmpq(RDX, Immediate(shifted)); |
| 1340 __ j(EQUAL, &donetest15b); |
| 1341 __ int3(); |
| 1342 __ Bind(&donetest15b); |
| 1343 } |
| 1288 | 1344 |
| 1289 __ movl(RAX, Immediate(0)); | 1345 __ movl(RAX, Immediate(0)); |
| 1290 __ ret(); | 1346 __ ret(); |
| 1291 } | 1347 } |
| 1292 | 1348 |
| 1293 | 1349 |
| 1294 ASSEMBLER_TEST_RUN(LogicalOps, test) { | 1350 ASSEMBLER_TEST_RUN(LogicalOps, test) { |
| 1295 typedef int (*LogicalOpsCode)(); | 1351 typedef int (*LogicalOpsCode)(); |
| 1296 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())()); | 1352 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())()); |
| 1297 } | 1353 } |
| (...skipping 2158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3456 EXPECT_EQ(ICData::kInt64RangeBit, range_of(Integer::New(kMaxInt64))); | 3512 EXPECT_EQ(ICData::kInt64RangeBit, range_of(Integer::New(kMaxInt64))); |
| 3457 EXPECT_EQ(ICData::kInt64RangeBit, range_of(Integer::New(kMinInt64))); | 3513 EXPECT_EQ(ICData::kInt64RangeBit, range_of(Integer::New(kMinInt64))); |
| 3458 | 3514 |
| 3459 EXPECT_EQ(0, range_of(Bool::True().raw())); | 3515 EXPECT_EQ(0, range_of(Bool::True().raw())); |
| 3460 } | 3516 } |
| 3461 | 3517 |
| 3462 | 3518 |
| 3463 } // namespace dart | 3519 } // namespace dart |
| 3464 | 3520 |
| 3465 #endif // defined TARGET_ARCH_X64 | 3521 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |