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

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

Issue 262333007: Adds arm64 double arithmetic instructions. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 7 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
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_ARM64) 6 #if defined(TARGET_ARCH_ARM64)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/cpu.h" 9 #include "vm/cpu.h"
10 #include "vm/os.h" 10 #include "vm/os.h"
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 __ ret(); 709 __ ret();
710 } 710 }
711 711
712 712
713 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { 713 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) {
714 typedef int (*SimpleCode)(); 714 typedef int (*SimpleCode)();
715 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); 715 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
716 } 716 }
717 717
718 718
719
720
721 ASSEMBLER_TEST_GENERATE(FcmpEqBranch, assembler) {
722 Label l;
723
724 __ LoadDImmediate(V0, 42.0, kNoPP);
725 __ LoadDImmediate(V1, 234.0, kNoPP);
726 __ LoadDImmediate(V2, 234.0, kNoPP);
727
728 __ fcmpd(V1, V2);
729 __ b(&l, EQ);
730 __ LoadDImmediate(V0, 0.0, kNoPP);
731 __ Bind(&l);
732 __ ret();
733 }
734
735
736 ASSEMBLER_TEST_RUN(FcmpEqBranch, test) {
737 typedef int (*SimpleCode)();
738 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
739 }
740
741
742 ASSEMBLER_TEST_GENERATE(FcmpEqBranchNotTaken, assembler) {
743 Label l;
744
745 __ LoadDImmediate(V0, 0.0, kNoPP);
746 __ LoadDImmediate(V1, 233.0, kNoPP);
747 __ LoadDImmediate(V2, 234.0, kNoPP);
748
749 __ fcmpd(V1, V2);
750 __ b(&l, EQ);
751 __ LoadDImmediate(V0, 42.0, kNoPP);
752 __ Bind(&l);
753 __ ret();
754 }
755
756
757 ASSEMBLER_TEST_RUN(FcmpEqBranchNotTaken, test) {
758 typedef int (*SimpleCode)();
759 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
760 }
761
762
763 ASSEMBLER_TEST_GENERATE(FcmpLtBranch, assembler) {
764 Label l;
765
766 __ LoadDImmediate(V0, 42.0, kNoPP);
767 __ LoadDImmediate(V1, 233.0, kNoPP);
768 __ LoadDImmediate(V2, 234.0, kNoPP);
769
770 __ fcmpd(V1, V2);
771 __ b(&l, LT);
772 __ LoadDImmediate(V0, 0.0, kNoPP);
773 __ Bind(&l);
774 __ ret();
775 }
776
777
778 ASSEMBLER_TEST_RUN(FcmpLtBranch, test) {
779 typedef int (*SimpleCode)();
780 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
781 }
782
783
784 ASSEMBLER_TEST_GENERATE(FcmpLtBranchNotTaken, assembler) {
785 Label l;
786
787 __ LoadDImmediate(V0, 0.0, kNoPP);
788 __ LoadDImmediate(V1, 235.0, kNoPP);
789 __ LoadDImmediate(V2, 234.0, kNoPP);
790
791 __ fcmpd(V1, V2);
792 __ b(&l, LT);
793 __ LoadDImmediate(V0, 42.0, kNoPP);
794 __ Bind(&l);
795 __ ret();
796 }
797
798
799 ASSEMBLER_TEST_RUN(FcmpLtBranchNotTaken, test) {
800 typedef int (*SimpleCode)();
801 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
802 }
803
804
805 ASSEMBLER_TEST_GENERATE(FcmpzGtBranch, assembler) {
806 Label l;
807
808 __ LoadDImmediate(V0, 235.0, kNoPP);
809 __ LoadDImmediate(V1, 233.0, kNoPP);
810
811 __ fcmpzd(V1);
812 __ b(&l, GT);
813 __ LoadDImmediate(V0, 0.0, kNoPP);
814 __ ret();
815 __ Bind(&l);
816 __ LoadDImmediate(V0, 42.0, kNoPP);
817 __ ret();
818 }
819
820
821 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) {
822 typedef int (*SimpleCode)();
823 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
824 }
825
826
719 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { 827 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) {
720 Label l; 828 Label l;
721 829
722 __ movz(R0, 42, 0); 830 __ movz(R0, 42, 0);
723 __ movz(R1, 2, 0); 831 __ movz(R1, 2, 0);
724 __ movz(R2, 1, 0); 832 __ movz(R2, 1, 0);
725 833
726 __ ands(R3, R1, Operand(R2)); 834 __ ands(R3, R1, Operand(R2));
727 __ b(&l, EQ); 835 __ b(&l, EQ);
728 __ movz(R0, 0, 0); 836 __ movz(R0, 0, 0);
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 __ ret(); 1446 __ ret();
1339 } 1447 }
1340 1448
1341 1449
1342 ASSEMBLER_TEST_RUN(CSelFalse, test) { 1450 ASSEMBLER_TEST_RUN(CSelFalse, test) {
1343 typedef int (*SimpleCode)(); 1451 typedef int (*SimpleCode)();
1344 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); 1452 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
1345 } 1453 }
1346 1454
1347 1455
1456 ASSEMBLER_TEST_GENERATE(CsincTrue, assembler) {
1457 __ LoadImmediate(R1, 42, kNoRegister);
1458 __ LoadImmediate(R2, 1234, kNoRegister);
1459 __ CompareRegisters(R1, R2);
1460 __ csinc(R0, R1, R2, LT);
1461 __ ret();
1462 }
1463
1464
1465 ASSEMBLER_TEST_RUN(CsincTrue, test) {
1466 typedef int (*SimpleCode)();
1467 EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
1468 }
1469
1470
1471 ASSEMBLER_TEST_GENERATE(CsincFalse, assembler) {
1472 __ LoadImmediate(R1, 42, kNoRegister);
1473 __ LoadImmediate(R2, 1234, kNoRegister);
1474 __ CompareRegisters(R1, R2);
1475 __ csinc(R0, R1, R2, GE);
1476 __ ret();
1477 }
1478
1479
1480 ASSEMBLER_TEST_RUN(CsincFalse, test) {
1481 typedef int (*SimpleCode)();
1482 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
1483 }
1484
1485
1348 // Floating point move immediate, to/from integer register. 1486 // Floating point move immediate, to/from integer register.
1349 ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) { 1487 ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) {
1350 __ LoadDImmediate(V0, 1.0, kNoPP); 1488 __ LoadDImmediate(V0, 1.0, kNoPP);
1351 __ ret(); 1489 __ ret();
1352 } 1490 }
1353 1491
1354 1492
1355 ASSEMBLER_TEST_RUN(Fmovdi, test) { 1493 ASSEMBLER_TEST_RUN(Fmovdi, test) {
1356 typedef int (*SimpleCode)(); 1494 typedef int (*SimpleCode)();
1357 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); 1495 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 __ ret(); 1544 __ ret();
1407 } 1545 }
1408 1546
1409 1547
1410 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { 1548 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) {
1411 typedef int (*SimpleCode)(); 1549 typedef int (*SimpleCode)();
1412 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry())); 1550 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
1413 } 1551 }
1414 1552
1415 1553
1554 ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) {
1555 __ LoadDImmediate(V0, 42.0, kNoPP);
1556 __ fcvtzds(R0, V0);
1557 __ ret();
1558 }
1559
1560
1561 ASSEMBLER_TEST_RUN(Fcvtzds, test) {
1562 typedef int (*SimpleCode)();
1563 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
1564 }
1565
1566
1567 ASSEMBLER_TEST_GENERATE(Scvtfd, assembler) {
1568 __ LoadImmediate(R0, 42, kNoPP);
1569 __ scvtfd(V0, R0);
1570 __ ret();
1571 }
1572
1573
1574 ASSEMBLER_TEST_RUN(Scvtfd, test) {
1575 typedef int (*SimpleCode)();
1576 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
1577 }
1578
1579
1580 ASSEMBLER_TEST_GENERATE(Fmuld, assembler) {
1581 __ LoadDImmediate(V1, 84.0, kNoPP);
1582 __ LoadDImmediate(V2, 0.5, kNoPP);
1583 __ fmuld(V0, V1, V2);
1584 __ ret();
1585 }
1586
1587
1588 ASSEMBLER_TEST_RUN(Fmuld, test) {
1589 typedef int (*SimpleCode)();
1590 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
1591 }
1592
1593
1594 ASSEMBLER_TEST_GENERATE(Fdivd, assembler) {
1595 __ LoadDImmediate(V1, 84.0, kNoPP);
1596 __ LoadDImmediate(V2, 2.0, kNoPP);
1597 __ fdivd(V0, V1, V2);
1598 __ ret();
1599 }
1600
1601
1602 ASSEMBLER_TEST_RUN(Fdivd, test) {
1603 typedef int (*SimpleCode)();
1604 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
1605 }
1606
1607
1608 ASSEMBLER_TEST_GENERATE(Faddd, assembler) {
1609 __ LoadDImmediate(V1, 41.5, kNoPP);
1610 __ LoadDImmediate(V2, 0.5, kNoPP);
1611 __ faddd(V0, V1, V2);
1612 __ ret();
1613 }
1614
1615
1616 ASSEMBLER_TEST_RUN(Faddd, test) {
1617 typedef int (*SimpleCode)();
1618 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
1619 }
1620
1621
1622 ASSEMBLER_TEST_GENERATE(Fsubd, assembler) {
1623 __ LoadDImmediate(V1, 42.5, kNoPP);
1624 __ LoadDImmediate(V2, 0.5, kNoPP);
1625 __ fsubd(V0, V1, V2);
1626 __ ret();
1627 }
1628
1629
1630 ASSEMBLER_TEST_RUN(Fsubd, test) {
1631 typedef int (*SimpleCode)();
1632 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
1633 }
1634
1635
1416 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { 1636 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) {
1417 __ LoadDImmediate(V0, 43.0, kNoPP); 1637 __ LoadDImmediate(V0, 43.0, kNoPP);
1418 __ LoadDImmediate(V1, 42.0, kNoPP); 1638 __ LoadDImmediate(V1, 42.0, kNoPP);
1419 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP); 1639 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP);
1420 __ add(R2, SP, Operand(1)); 1640 __ add(R2, SP, Operand(1));
1421 __ fstrd(V1, Address(R2, -1)); 1641 __ fstrd(V1, Address(R2, -1));
1422 __ fldrd(V0, Address(R2, -1)); 1642 __ fldrd(V0, Address(R2, -1));
1423 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP); 1643 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP);
1424 __ ret(); 1644 __ ret();
1425 } 1645 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1523 R1); 1743 R1);
1524 __ Pop(LR); 1744 __ Pop(LR);
1525 __ Pop(CTX); 1745 __ Pop(CTX);
1526 __ PopAndUntagPP(); 1746 __ PopAndUntagPP();
1527 __ ret(); 1747 __ ret();
1528 } 1748 }
1529 1749
1530 } // namespace dart 1750 } // namespace dart
1531 1751
1532 #endif // defined(TARGET_ARCH_ARM64) 1752 #endif // defined(TARGET_ARCH_ARM64)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698