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

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

Issue 786933009: Process two 32-bit digits as one 64-bit digit in all bigint intrinsics on x64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 11 months 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/intrinsifier_x64.cc » ('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 489 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.cc ('k') | runtime/vm/intrinsifier_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698