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

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

Issue 15899010: Implement a few more features on ARM. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 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_arm.cc ('k') | runtime/vm/flow_graph_compiler_arm.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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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_ARM) 6 #if defined(TARGET_ARCH_ARM)
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 619 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 EXPECT(test != NULL); 630 EXPECT(test != NULL);
631 typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor); 631 typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor);
632 EXPECT_EQ(0x1000400000da8LL, 632 EXPECT_EQ(0x1000400000da8LL,
633 EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(), 633 EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(),
634 0x12345678, 0x1234)); 634 0x12345678, 0x1234));
635 } 635 }
636 636
637 637
638 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) { 638 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) {
639 __ Push(R4); 639 __ Push(R4);
640 __ Mov(IP, R0); 640 __ mov(IP, ShifterOperand(R0));
641 __ mul(R4, R2, R1); 641 __ mul(R4, R2, R1);
642 __ umull(R0, R1, R2, IP); 642 __ umull(R0, R1, R2, IP);
643 __ mla(R2, IP, R3, R4); 643 __ mla(R2, IP, R3, R4);
644 __ add(R1, R2, ShifterOperand(R1)); 644 __ add(R1, R2, ShifterOperand(R1));
645 __ Pop(R4); 645 __ Pop(R4);
646 __ bx(LR); 646 __ bx(LR);
647 } 647 }
648 648
649 649
650 ASSEMBLER_TEST_RUN(Multiply64To64, test) { 650 ASSEMBLER_TEST_RUN(Multiply64To64, test) {
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 929
930 930
931 ASSEMBLER_TEST_RUN(Ldrh1, test) { 931 ASSEMBLER_TEST_RUN(Ldrh1, test) {
932 EXPECT(test != NULL); 932 EXPECT(test != NULL);
933 typedef int (*Tst)(); 933 typedef int (*Tst)();
934 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 934 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
935 } 935 }
936 936
937 937
938 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) { 938 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) {
939 __ Mov(IP, SP); 939 __ mov(IP, ShifterOperand(SP));
940 __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex)); 940 __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex));
941 __ strd(R0, Address(IP, (-kWordSize * 28))); 941 __ strd(R0, Address(IP, (-kWordSize * 28)));
942 __ ldrd(R2, Address(IP, (-kWordSize * 28))); 942 __ ldrd(R2, Address(IP, (-kWordSize * 28)));
943 __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex)); 943 __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
944 __ sub(R0, R0, ShifterOperand(R2)); 944 __ sub(R0, R0, ShifterOperand(R2));
945 __ add(R1, R1, ShifterOperand(R3)); 945 __ add(R1, R1, ShifterOperand(R3));
946 __ bx(LR); 946 __ bx(LR);
947 } 947 }
948 948
949 949
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 typedef int (*Tst)(); 1416 typedef int (*Tst)();
1417 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1417 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1418 } 1418 }
1419 1419
1420 1420
1421 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { 1421 ASSEMBLER_TEST_GENERATE(Udiv, assembler) {
1422 if (CPUFeatures::integer_division_supported()) { 1422 if (CPUFeatures::integer_division_supported()) {
1423 __ mov(R0, ShifterOperand(27)); 1423 __ mov(R0, ShifterOperand(27));
1424 __ mov(R1, ShifterOperand(9)); 1424 __ mov(R1, ShifterOperand(9));
1425 __ udiv(R2, R0, R1); 1425 __ udiv(R2, R0, R1);
1426 __ Mov(R0, R2); 1426 __ mov(R0, ShifterOperand(R2));
1427 } else { 1427 } else {
1428 __ mov(R0, ShifterOperand(3)); 1428 __ mov(R0, ShifterOperand(3));
1429 } 1429 }
1430 __ bx(LR); 1430 __ bx(LR);
1431 } 1431 }
1432 1432
1433 1433
1434 ASSEMBLER_TEST_RUN(Udiv, test) { 1434 ASSEMBLER_TEST_RUN(Udiv, test) {
1435 EXPECT(test != NULL); 1435 EXPECT(test != NULL);
1436 typedef int (*Tst)(); 1436 typedef int (*Tst)();
1437 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1437 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1438 } 1438 }
1439 1439
1440 1440
1441 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { 1441 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) {
1442 if (CPUFeatures::integer_division_supported()) { 1442 if (CPUFeatures::integer_division_supported()) {
1443 __ mov(R0, ShifterOperand(27)); 1443 __ mov(R0, ShifterOperand(27));
1444 __ LoadImmediate(R1, -9); 1444 __ LoadImmediate(R1, -9);
1445 __ sdiv(R2, R0, R1); 1445 __ sdiv(R2, R0, R1);
1446 __ Mov(R0, R2); 1446 __ mov(R0, ShifterOperand(R2));
1447 } else { 1447 } else {
1448 __ LoadImmediate(R0, -3); 1448 __ LoadImmediate(R0, -3);
1449 } 1449 }
1450 __ bx(LR); 1450 __ bx(LR);
1451 } 1451 }
1452 1452
1453 1453
1454 ASSEMBLER_TEST_RUN(Sdiv, test) { 1454 ASSEMBLER_TEST_RUN(Sdiv, test) {
1455 EXPECT(test != NULL); 1455 EXPECT(test != NULL);
1456 typedef int (*Tst)(); 1456 typedef int (*Tst)();
1457 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1457 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1458 } 1458 }
1459 1459
1460 1460
1461 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { 1461 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) {
1462 if (CPUFeatures::integer_division_supported()) { 1462 if (CPUFeatures::integer_division_supported()) {
1463 __ mov(R0, ShifterOperand(27)); 1463 __ mov(R0, ShifterOperand(27));
1464 __ mov(R1, ShifterOperand(0)); 1464 __ mov(R1, ShifterOperand(0));
1465 __ udiv(R2, R0, R1); 1465 __ udiv(R2, R0, R1);
1466 __ Mov(R0, R2); 1466 __ mov(R0, ShifterOperand(R2));
1467 } else { 1467 } else {
1468 __ LoadImmediate(R0, 0); 1468 __ LoadImmediate(R0, 0);
1469 } 1469 }
1470 __ bx(LR); 1470 __ bx(LR);
1471 } 1471 }
1472 1472
1473 1473
1474 ASSEMBLER_TEST_RUN(Udiv_zero, test) { 1474 ASSEMBLER_TEST_RUN(Udiv_zero, test) {
1475 EXPECT(test != NULL); 1475 EXPECT(test != NULL);
1476 typedef int (*Tst)(); 1476 typedef int (*Tst)();
1477 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1477 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1478 } 1478 }
1479 1479
1480 1480
1481 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { 1481 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) {
1482 if (CPUFeatures::integer_division_supported()) { 1482 if (CPUFeatures::integer_division_supported()) {
1483 __ mov(R0, ShifterOperand(27)); 1483 __ mov(R0, ShifterOperand(27));
1484 __ mov(R1, ShifterOperand(0)); 1484 __ mov(R1, ShifterOperand(0));
1485 __ udiv(R2, R0, R1); 1485 __ udiv(R2, R0, R1);
1486 __ Mov(R0, R2); 1486 __ mov(R0, ShifterOperand(R2));
1487 } else { 1487 } else {
1488 __ LoadImmediate(R0, 0); 1488 __ LoadImmediate(R0, 0);
1489 } 1489 }
1490 __ bx(LR); 1490 __ bx(LR);
1491 } 1491 }
1492 1492
1493 1493
1494 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { 1494 ASSEMBLER_TEST_RUN(Sdiv_zero, test) {
1495 EXPECT(test != NULL); 1495 EXPECT(test != NULL);
1496 typedef int (*Tst)(); 1496 typedef int (*Tst)();
1497 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1497 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1498 } 1498 }
1499 1499
1500 1500
1501 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { 1501 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) {
1502 if (CPUFeatures::integer_division_supported()) { 1502 if (CPUFeatures::integer_division_supported()) {
1503 __ LoadImmediate(R0, 0x80000000); 1503 __ LoadImmediate(R0, 0x80000000);
1504 __ LoadImmediate(R1, 0xffffffff); 1504 __ LoadImmediate(R1, 0xffffffff);
1505 __ udiv(R2, R0, R1); 1505 __ udiv(R2, R0, R1);
1506 __ Mov(R0, R2); 1506 __ mov(R0, ShifterOperand(R2));
1507 } else { 1507 } else {
1508 __ LoadImmediate(R0, 0); 1508 __ LoadImmediate(R0, 0);
1509 } 1509 }
1510 __ bx(LR); 1510 __ bx(LR);
1511 } 1511 }
1512 1512
1513 1513
1514 ASSEMBLER_TEST_RUN(Udiv_corner, test) { 1514 ASSEMBLER_TEST_RUN(Udiv_corner, test) {
1515 EXPECT(test != NULL); 1515 EXPECT(test != NULL);
1516 typedef int (*Tst)(); 1516 typedef int (*Tst)();
1517 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1517 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1518 } 1518 }
1519 1519
1520 1520
1521 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { 1521 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) {
1522 if (CPUFeatures::integer_division_supported()) { 1522 if (CPUFeatures::integer_division_supported()) {
1523 __ LoadImmediate(R0, 0x80000000); 1523 __ LoadImmediate(R0, 0x80000000);
1524 __ LoadImmediate(R1, 0xffffffff); 1524 __ LoadImmediate(R1, 0xffffffff);
1525 __ sdiv(R2, R0, R1); 1525 __ sdiv(R2, R0, R1);
1526 __ Mov(R0, R2); 1526 __ mov(R0, ShifterOperand(R2));
1527 } else { 1527 } else {
1528 __ LoadImmediate(R0, 0x80000000); 1528 __ LoadImmediate(R0, 0x80000000);
1529 } 1529 }
1530 __ bx(LR); 1530 __ bx(LR);
1531 } 1531 }
1532 1532
1533 1533
1534 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { 1534 ASSEMBLER_TEST_RUN(Sdiv_corner, test) {
1535 EXPECT(test != NULL); 1535 EXPECT(test != NULL);
1536 typedef int (*Tst)(); 1536 typedef int (*Tst)();
(...skipping 29 matching lines...) Expand all
1566 __ StoreIntoObject(R2, 1566 __ StoreIntoObject(R2,
1567 FieldAddress(R2, GrowableObjectArray::data_offset()), 1567 FieldAddress(R2, GrowableObjectArray::data_offset()),
1568 R1); 1568 R1);
1569 __ PopList((1 << CTX) | (1 << LR)); 1569 __ PopList((1 << CTX) | (1 << LR));
1570 __ Ret(); 1570 __ Ret();
1571 } 1571 }
1572 1572
1573 } // namespace dart 1573 } // namespace dart
1574 1574
1575 #endif // defined TARGET_ARCH_ARM 1575 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.cc ('k') | runtime/vm/flow_graph_compiler_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698