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

Side by Side Diff: test/cctest/test-macro-assembler-mips64.cc

Issue 2543643005: MIPS[64]: Fix tests for macro-assembler. (Closed)
Patch Set: Created 4 years 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
« no previous file with comments | « test/cctest/test-macro-assembler-mips.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 F_CVT f = FUNCTION_CAST<F_CVT>(code->entry()); 688 F_CVT f = FUNCTION_CAST<F_CVT>(code->entry());
689 689
690 return reinterpret_cast<RET_TYPE>( 690 return reinterpret_cast<RET_TYPE>(
691 CALL_GENERATED_CODE(isolate, f, x, 0, 0, 0, 0)); 691 CALL_GENERATED_CODE(isolate, f, x, 0, 0, 0, 0));
692 } 692 }
693 693
694 TEST(Cvt_s_uw_Trunc_uw_s) { 694 TEST(Cvt_s_uw_Trunc_uw_s) {
695 CcTest::InitializeVM(); 695 CcTest::InitializeVM();
696 FOR_UINT32_INPUTS(i, cvt_trunc_uint32_test_values) { 696 FOR_UINT32_INPUTS(i, cvt_trunc_uint32_test_values) {
697 uint32_t input = *i; 697 uint32_t input = *i;
698 CHECK_EQ(static_cast<float>(input), 698 auto fn = [](MacroAssembler* masm) {
699 run_Cvt<uint64_t>(input, [](MacroAssembler* masm) { 699 __ Cvt_s_uw(f0, a0);
700 __ Cvt_s_uw(f0, a0); 700 __ mthc1(zero_reg, f2);
701 __ mthc1(zero_reg, f2); 701 __ Trunc_uw_s(f2, f0, f1);
702 __ Trunc_uw_s(f2, f0, f1); 702 };
703 })); 703 CHECK_EQ(static_cast<float>(input), run_Cvt<uint64_t>(input, fn));
704 } 704 }
705 } 705 }
706 706
707 TEST(Cvt_s_ul_Trunc_ul_s) { 707 TEST(Cvt_s_ul_Trunc_ul_s) {
708 CcTest::InitializeVM(); 708 CcTest::InitializeVM();
709 FOR_UINT64_INPUTS(i, cvt_trunc_uint64_test_values) { 709 FOR_UINT64_INPUTS(i, cvt_trunc_uint64_test_values) {
710 uint64_t input = *i; 710 uint64_t input = *i;
711 CHECK_EQ(static_cast<float>(input), 711 auto fn = [](MacroAssembler* masm) {
712 run_Cvt<uint64_t>(input, [](MacroAssembler* masm) { 712 __ Cvt_s_ul(f0, a0);
713 __ Cvt_s_ul(f0, a0); 713 __ Trunc_ul_s(f2, f0, f1, v0);
714 __ Trunc_ul_s(f2, f0, f1, v0); 714 };
715 })); 715 CHECK_EQ(static_cast<float>(input), run_Cvt<uint64_t>(input, fn));
716 } 716 }
717 } 717 }
718 718
719 TEST(Cvt_d_ul_Trunc_ul_d) { 719 TEST(Cvt_d_ul_Trunc_ul_d) {
720 CcTest::InitializeVM(); 720 CcTest::InitializeVM();
721 FOR_UINT64_INPUTS(i, cvt_trunc_uint64_test_values) { 721 FOR_UINT64_INPUTS(i, cvt_trunc_uint64_test_values) {
722 uint64_t input = *i; 722 uint64_t input = *i;
723 CHECK_EQ(static_cast<double>(input), 723 auto fn = [](MacroAssembler* masm) {
724 run_Cvt<uint64_t>(input, [](MacroAssembler* masm) { 724 __ Cvt_d_ul(f0, a0);
725 __ Cvt_d_ul(f0, a0); 725 __ Trunc_ul_d(f2, f0, f1, v0);
726 __ Trunc_ul_d(f2, f0, f1, v0); 726 };
727 })); 727 CHECK_EQ(static_cast<double>(input), run_Cvt<uint64_t>(input, fn));
728 } 728 }
729 } 729 }
730 730
731 TEST(cvt_d_l_Trunc_l_d) { 731 TEST(cvt_d_l_Trunc_l_d) {
732 CcTest::InitializeVM(); 732 CcTest::InitializeVM();
733 FOR_INT64_INPUTS(i, cvt_trunc_int64_test_values) { 733 FOR_INT64_INPUTS(i, cvt_trunc_int64_test_values) {
734 int64_t input = *i; 734 int64_t input = *i;
735 CHECK_EQ(static_cast<double>(input), 735 auto fn = [](MacroAssembler* masm) {
736 run_Cvt<int64_t>(input, [](MacroAssembler* masm) { 736 __ dmtc1(a0, f4);
737 __ dmtc1(a0, f4); 737 __ cvt_d_l(f0, f4);
738 __ cvt_d_l(f0, f4); 738 __ Trunc_l_d(f2, f0);
739 __ Trunc_l_d(f2, f0); 739 };
740 })); 740 CHECK_EQ(static_cast<double>(input), run_Cvt<int64_t>(input, fn));
741 } 741 }
742 } 742 }
743 743
744 TEST(cvt_d_l_Trunc_l_ud) { 744 TEST(cvt_d_l_Trunc_l_ud) {
745 CcTest::InitializeVM(); 745 CcTest::InitializeVM();
746 FOR_INT64_INPUTS(i, cvt_trunc_int64_test_values) { 746 FOR_INT64_INPUTS(i, cvt_trunc_int64_test_values) {
747 int64_t input = *i; 747 int64_t input = *i;
748 uint64_t abs_input = (input < 0) ? -input : input; 748 uint64_t abs_input = (input < 0) ? -input : input;
749 CHECK_EQ(static_cast<double>(abs_input), 749 auto fn = [](MacroAssembler* masm) {
750 run_Cvt<uint64_t>(input, [](MacroAssembler* masm) { 750 __ dmtc1(a0, f4);
751 __ dmtc1(a0, f4); 751 __ cvt_d_l(f0, f4);
752 __ cvt_d_l(f0, f4); 752 __ Trunc_l_ud(f2, f0, f6);
753 __ Trunc_l_ud(f2, f0, f6); 753 };
754 })); 754 CHECK_EQ(static_cast<double>(abs_input), run_Cvt<uint64_t>(input, fn));
755 } 755 }
756 } 756 }
757 757
758 TEST(cvt_d_w_Trunc_w_d) { 758 TEST(cvt_d_w_Trunc_w_d) {
759 CcTest::InitializeVM(); 759 CcTest::InitializeVM();
760 FOR_INT32_INPUTS(i, cvt_trunc_int32_test_values) { 760 FOR_INT32_INPUTS(i, cvt_trunc_int32_test_values) {
761 int32_t input = *i; 761 int32_t input = *i;
762 CHECK_EQ(static_cast<double>(input), 762 auto fn = [](MacroAssembler* masm) {
763 run_Cvt<int64_t>(input, [](MacroAssembler* masm) { 763 __ mtc1(a0, f4);
764 __ mtc1(a0, f4); 764 __ cvt_d_w(f0, f4);
765 __ cvt_d_w(f0, f4); 765 __ Trunc_w_d(f2, f0);
766 __ Trunc_w_d(f2, f0); 766 __ mfc1(v1, f2);
767 __ mfc1(v1, f2); 767 __ dmtc1(v1, f2);
768 __ dmtc1(v1, f2); 768 };
769 })); 769 CHECK_EQ(static_cast<double>(input), run_Cvt<int64_t>(input, fn));
770 } 770 }
771 } 771 }
772 772
773 static const std::vector<int32_t> overflow_int32_test_values() { 773 static const std::vector<int32_t> overflow_int32_test_values() {
774 static const int32_t kValues[] = { 774 static const int32_t kValues[] = {
775 static_cast<int32_t>(0xf0000000), static_cast<int32_t>(0x00000001), 775 static_cast<int32_t>(0xf0000000), static_cast<int32_t>(0x00000001),
776 static_cast<int32_t>(0xff000000), static_cast<int32_t>(0x0000f000), 776 static_cast<int32_t>(0xff000000), static_cast<int32_t>(0x0000f000),
777 static_cast<int32_t>(0x0f000000), static_cast<int32_t>(0x991234ab), 777 static_cast<int32_t>(0x0f000000), static_cast<int32_t>(0x991234ab),
778 static_cast<int32_t>(0xb0ffff01), static_cast<int32_t>(0x00006fff), 778 static_cast<int32_t>(0xb0ffff01), static_cast<int32_t>(0x00006fff),
779 static_cast<int32_t>(0xffffffff)}; 779 static_cast<int32_t>(0xffffffff)};
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after
1610 char memory_buffer[kBufferSize]; 1610 char memory_buffer[kBufferSize];
1611 char* buffer_middle = memory_buffer + (kBufferSize / 2); 1611 char* buffer_middle = memory_buffer + (kBufferSize / 2);
1612 1612
1613 FOR_UINT64_INPUTS(i, unsigned_test_values) { 1613 FOR_UINT64_INPUTS(i, unsigned_test_values) {
1614 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) { 1614 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) {
1615 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) { 1615 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) {
1616 uint16_t value = static_cast<uint64_t>(*i & 0xFFFF); 1616 uint16_t value = static_cast<uint64_t>(*i & 0xFFFF);
1617 int32_t in_offset = *j1 + *k1; 1617 int32_t in_offset = *j1 + *k1;
1618 int32_t out_offset = *j2 + *k2; 1618 int32_t out_offset = *j2 + *k2;
1619 1619
1620 CHECK_EQ(true, run_Unaligned<uint16_t>( 1620 auto fn_1 = [](MacroAssembler* masm, int32_t in_offset,
1621 buffer_middle, in_offset, out_offset, value, 1621 int32_t out_offset) {
1622 [](MacroAssembler* masm, int32_t in_offset, 1622 __ Ulh(v0, MemOperand(a0, in_offset));
1623 int32_t out_offset) { 1623 __ Ush(v0, MemOperand(a0, out_offset), v0);
1624 __ Ulh(v0, MemOperand(a0, in_offset)); 1624 };
1625 __ Ush(v0, MemOperand(a0, out_offset), v0); 1625 CHECK_EQ(true, run_Unaligned<uint16_t>(buffer_middle, in_offset,
1626 })); 1626 out_offset, value, fn_1));
1627 CHECK_EQ(true, run_Unaligned<uint16_t>( 1627
1628 buffer_middle, in_offset, out_offset, value, 1628 auto fn_2 = [](MacroAssembler* masm, int32_t in_offset,
1629 [](MacroAssembler* masm, int32_t in_offset, 1629 int32_t out_offset) {
1630 int32_t out_offset) { 1630 __ mov(t0, a0);
1631 __ mov(t0, a0); 1631 __ Ulh(a0, MemOperand(a0, in_offset));
1632 __ Ulh(a0, MemOperand(a0, in_offset)); 1632 __ Ush(a0, MemOperand(t0, out_offset), v0);
1633 __ Ush(a0, MemOperand(t0, out_offset), v0); 1633 };
1634 })); 1634 CHECK_EQ(true, run_Unaligned<uint16_t>(buffer_middle, in_offset,
1635 CHECK_EQ(true, run_Unaligned<uint16_t>( 1635 out_offset, value, fn_2));
1636 buffer_middle, in_offset, out_offset, value, 1636
1637 [](MacroAssembler* masm, int32_t in_offset, 1637 auto fn_3 = [](MacroAssembler* masm, int32_t in_offset,
1638 int32_t out_offset) { 1638 int32_t out_offset) {
1639 __ mov(t0, a0); 1639 __ mov(t0, a0);
1640 __ Ulhu(a0, MemOperand(a0, in_offset)); 1640 __ Ulhu(a0, MemOperand(a0, in_offset));
1641 __ Ush(a0, MemOperand(t0, out_offset), t1); 1641 __ Ush(a0, MemOperand(t0, out_offset), t1);
1642 })); 1642 };
1643 CHECK_EQ(true, run_Unaligned<uint16_t>( 1643 CHECK_EQ(true, run_Unaligned<uint16_t>(buffer_middle, in_offset,
1644 buffer_middle, in_offset, out_offset, value, 1644 out_offset, value, fn_3));
1645 [](MacroAssembler* masm, int32_t in_offset, 1645
1646 int32_t out_offset) { 1646 auto fn_4 = [](MacroAssembler* masm, int32_t in_offset,
1647 __ Ulhu(v0, MemOperand(a0, in_offset)); 1647 int32_t out_offset) {
1648 __ Ush(v0, MemOperand(a0, out_offset), t1); 1648 __ Ulhu(v0, MemOperand(a0, in_offset));
1649 })); 1649 __ Ush(v0, MemOperand(a0, out_offset), t1);
1650 };
1651 CHECK_EQ(true, run_Unaligned<uint16_t>(buffer_middle, in_offset,
1652 out_offset, value, fn_4));
1650 } 1653 }
1651 } 1654 }
1652 } 1655 }
1653 } 1656 }
1654 1657
1655 TEST(Ulh_bitextension) { 1658 TEST(Ulh_bitextension) {
1656 CcTest::InitializeVM(); 1659 CcTest::InitializeVM();
1657 1660
1658 static const int kBufferSize = 300 * KB; 1661 static const int kBufferSize = 300 * KB;
1659 char memory_buffer[kBufferSize]; 1662 char memory_buffer[kBufferSize];
1660 char* buffer_middle = memory_buffer + (kBufferSize / 2); 1663 char* buffer_middle = memory_buffer + (kBufferSize / 2);
1661 1664
1662 FOR_UINT64_INPUTS(i, unsigned_test_values) { 1665 FOR_UINT64_INPUTS(i, unsigned_test_values) {
1663 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) { 1666 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) {
1664 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) { 1667 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) {
1665 uint16_t value = static_cast<uint64_t>(*i & 0xFFFF); 1668 uint16_t value = static_cast<uint64_t>(*i & 0xFFFF);
1666 int32_t in_offset = *j1 + *k1; 1669 int32_t in_offset = *j1 + *k1;
1667 int32_t out_offset = *j2 + *k2; 1670 int32_t out_offset = *j2 + *k2;
1668 1671
1669 CHECK_EQ(true, run_Unaligned<uint16_t>( 1672 auto fn = [](MacroAssembler* masm, int32_t in_offset,
1670 buffer_middle, in_offset, out_offset, value, 1673 int32_t out_offset) {
1671 [](MacroAssembler* masm, int32_t in_offset, 1674 Label success, fail, end, different;
1672 int32_t out_offset) { 1675 __ Ulh(t0, MemOperand(a0, in_offset));
1673 Label success, fail, end, different; 1676 __ Ulhu(t1, MemOperand(a0, in_offset));
1674 __ Ulh(t0, MemOperand(a0, in_offset)); 1677 __ Branch(&different, ne, t0, Operand(t1));
1675 __ Ulhu(t1, MemOperand(a0, in_offset));
1676 __ Branch(&different, ne, t0, Operand(t1));
1677 1678
1678 // If signed and unsigned values are same, check 1679 // If signed and unsigned values are same, check
1679 // the upper bits to see if they are zero 1680 // the upper bits to see if they are zero
1680 __ sra(t0, t0, 15); 1681 __ sra(t0, t0, 15);
1681 __ Branch(&success, eq, t0, Operand(zero_reg)); 1682 __ Branch(&success, eq, t0, Operand(zero_reg));
1682 __ Branch(&fail); 1683 __ Branch(&fail);
1683 1684
1684 // If signed and unsigned values are different, 1685 // If signed and unsigned values are different,
1685 // check that the upper bits are complementary 1686 // check that the upper bits are complementary
1686 __ bind(&different); 1687 __ bind(&different);
1687 __ sra(t1, t1, 15); 1688 __ sra(t1, t1, 15);
1688 __ Branch(&fail, ne, t1, Operand(1)); 1689 __ Branch(&fail, ne, t1, Operand(1));
1689 __ sra(t0, t0, 15); 1690 __ sra(t0, t0, 15);
1690 __ addiu(t0, t0, 1); 1691 __ addiu(t0, t0, 1);
1691 __ Branch(&fail, ne, t0, Operand(zero_reg)); 1692 __ Branch(&fail, ne, t0, Operand(zero_reg));
1692 // Fall through to success 1693 // Fall through to success
1693 1694
1694 __ bind(&success); 1695 __ bind(&success);
1695 __ Ulh(t0, MemOperand(a0, in_offset)); 1696 __ Ulh(t0, MemOperand(a0, in_offset));
1696 __ Ush(t0, MemOperand(a0, out_offset), v0); 1697 __ Ush(t0, MemOperand(a0, out_offset), v0);
1697 __ Branch(&end); 1698 __ Branch(&end);
1698 __ bind(&fail); 1699 __ bind(&fail);
1699 __ Ush(zero_reg, MemOperand(a0, out_offset), v0); 1700 __ Ush(zero_reg, MemOperand(a0, out_offset), v0);
1700 __ bind(&end); 1701 __ bind(&end);
1701 })); 1702 };
1703 CHECK_EQ(true, run_Unaligned<uint16_t>(buffer_middle, in_offset,
1704 out_offset, value, fn));
1702 } 1705 }
1703 } 1706 }
1704 } 1707 }
1705 } 1708 }
1706 1709
1707 TEST(Ulw) { 1710 TEST(Ulw) {
1708 CcTest::InitializeVM(); 1711 CcTest::InitializeVM();
1709 1712
1710 static const int kBufferSize = 300 * KB; 1713 static const int kBufferSize = 300 * KB;
1711 char memory_buffer[kBufferSize]; 1714 char memory_buffer[kBufferSize];
1712 char* buffer_middle = memory_buffer + (kBufferSize / 2); 1715 char* buffer_middle = memory_buffer + (kBufferSize / 2);
1713 1716
1714 FOR_UINT64_INPUTS(i, unsigned_test_values) { 1717 FOR_UINT64_INPUTS(i, unsigned_test_values) {
1715 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) { 1718 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) {
1716 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) { 1719 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) {
1717 uint32_t value = static_cast<uint32_t>(*i & 0xFFFFFFFF); 1720 uint32_t value = static_cast<uint32_t>(*i & 0xFFFFFFFF);
1718 int32_t in_offset = *j1 + *k1; 1721 int32_t in_offset = *j1 + *k1;
1719 int32_t out_offset = *j2 + *k2; 1722 int32_t out_offset = *j2 + *k2;
1720 1723
1721 CHECK_EQ(true, run_Unaligned<uint32_t>( 1724 auto fn_1 = [](MacroAssembler* masm, int32_t in_offset,
1722 buffer_middle, in_offset, out_offset, value, 1725 int32_t out_offset) {
1723 [](MacroAssembler* masm, int32_t in_offset, 1726 __ Ulw(v0, MemOperand(a0, in_offset));
1724 int32_t out_offset) { 1727 __ Usw(v0, MemOperand(a0, out_offset));
1725 __ Ulw(v0, MemOperand(a0, in_offset)); 1728 };
1726 __ Usw(v0, MemOperand(a0, out_offset)); 1729 CHECK_EQ(true, run_Unaligned<uint32_t>(buffer_middle, in_offset,
1727 })); 1730 out_offset, value, fn_1));
1731
1732 auto fn_2 = [](MacroAssembler* masm, int32_t in_offset,
1733 int32_t out_offset) {
1734 __ mov(t0, a0);
1735 __ Ulw(a0, MemOperand(a0, in_offset));
1736 __ Usw(a0, MemOperand(t0, out_offset));
1737 };
1728 CHECK_EQ(true, 1738 CHECK_EQ(true,
1729 run_Unaligned<uint32_t>( 1739 run_Unaligned<uint32_t>(buffer_middle, in_offset, out_offset,
1730 buffer_middle, in_offset, out_offset, (uint32_t)value, 1740 (uint32_t)value, fn_2));
1731 [](MacroAssembler* masm, int32_t in_offset, 1741
1732 int32_t out_offset) { 1742 auto fn_3 = [](MacroAssembler* masm, int32_t in_offset,
1733 __ mov(t0, a0); 1743 int32_t out_offset) {
1734 __ Ulw(a0, MemOperand(a0, in_offset)); 1744 __ Ulwu(v0, MemOperand(a0, in_offset));
1735 __ Usw(a0, MemOperand(t0, out_offset)); 1745 __ Usw(v0, MemOperand(a0, out_offset));
1736 })); 1746 };
1737 CHECK_EQ(true, run_Unaligned<uint32_t>( 1747 CHECK_EQ(true, run_Unaligned<uint32_t>(buffer_middle, in_offset,
1738 buffer_middle, in_offset, out_offset, value, 1748 out_offset, value, fn_3));
1739 [](MacroAssembler* masm, int32_t in_offset, 1749
1740 int32_t out_offset) { 1750 auto fn_4 = [](MacroAssembler* masm, int32_t in_offset,
1741 __ Ulwu(v0, MemOperand(a0, in_offset)); 1751 int32_t out_offset) {
1742 __ Usw(v0, MemOperand(a0, out_offset)); 1752 __ mov(t0, a0);
1743 })); 1753 __ Ulwu(a0, MemOperand(a0, in_offset));
1754 __ Usw(a0, MemOperand(t0, out_offset));
1755 };
1744 CHECK_EQ(true, 1756 CHECK_EQ(true,
1745 run_Unaligned<uint32_t>( 1757 run_Unaligned<uint32_t>(buffer_middle, in_offset, out_offset,
1746 buffer_middle, in_offset, out_offset, (uint32_t)value, 1758 (uint32_t)value, fn_4));
1747 [](MacroAssembler* masm, int32_t in_offset,
1748 int32_t out_offset) {
1749 __ mov(t0, a0);
1750 __ Ulwu(a0, MemOperand(a0, in_offset));
1751 __ Usw(a0, MemOperand(t0, out_offset));
1752 }));
1753 } 1759 }
1754 } 1760 }
1755 } 1761 }
1756 } 1762 }
1757 1763
1758 TEST(Ulw_extension) { 1764 TEST(Ulw_extension) {
1759 CcTest::InitializeVM(); 1765 CcTest::InitializeVM();
1760 1766
1761 static const int kBufferSize = 300 * KB; 1767 static const int kBufferSize = 300 * KB;
1762 char memory_buffer[kBufferSize]; 1768 char memory_buffer[kBufferSize];
1763 char* buffer_middle = memory_buffer + (kBufferSize / 2); 1769 char* buffer_middle = memory_buffer + (kBufferSize / 2);
1764 1770
1765 FOR_UINT64_INPUTS(i, unsigned_test_values) { 1771 FOR_UINT64_INPUTS(i, unsigned_test_values) {
1766 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) { 1772 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) {
1767 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) { 1773 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) {
1768 uint32_t value = static_cast<uint32_t>(*i & 0xFFFFFFFF); 1774 uint32_t value = static_cast<uint32_t>(*i & 0xFFFFFFFF);
1769 int32_t in_offset = *j1 + *k1; 1775 int32_t in_offset = *j1 + *k1;
1770 int32_t out_offset = *j2 + *k2; 1776 int32_t out_offset = *j2 + *k2;
1771 1777
1772 CHECK_EQ(true, run_Unaligned<uint32_t>( 1778 auto fn = [](MacroAssembler* masm, int32_t in_offset,
1773 buffer_middle, in_offset, out_offset, value, 1779 int32_t out_offset) {
1774 [](MacroAssembler* masm, int32_t in_offset, 1780 Label success, fail, end, different;
1775 int32_t out_offset) { 1781 __ Ulw(t0, MemOperand(a0, in_offset));
1776 Label success, fail, end, different; 1782 __ Ulwu(t1, MemOperand(a0, in_offset));
1777 __ Ulw(t0, MemOperand(a0, in_offset)); 1783 __ Branch(&different, ne, t0, Operand(t1));
1778 __ Ulwu(t1, MemOperand(a0, in_offset));
1779 __ Branch(&different, ne, t0, Operand(t1));
1780 1784
1781 // If signed and unsigned values are same, check 1785 // If signed and unsigned values are same, check
1782 // the upper bits to see if they are zero 1786 // the upper bits to see if they are zero
1783 __ dsra(t0, t0, 31); 1787 __ dsra(t0, t0, 31);
1784 __ Branch(&success, eq, t0, Operand(zero_reg)); 1788 __ Branch(&success, eq, t0, Operand(zero_reg));
1785 __ Branch(&fail); 1789 __ Branch(&fail);
1786 1790
1787 // If signed and unsigned values are different, 1791 // If signed and unsigned values are different,
1788 // check that the upper bits are complementary 1792 // check that the upper bits are complementary
1789 __ bind(&different); 1793 __ bind(&different);
1790 __ dsra(t1, t1, 31); 1794 __ dsra(t1, t1, 31);
1791 __ Branch(&fail, ne, t1, Operand(1)); 1795 __ Branch(&fail, ne, t1, Operand(1));
1792 __ dsra(t0, t0, 31); 1796 __ dsra(t0, t0, 31);
1793 __ daddiu(t0, t0, 1); 1797 __ daddiu(t0, t0, 1);
1794 __ Branch(&fail, ne, t0, Operand(zero_reg)); 1798 __ Branch(&fail, ne, t0, Operand(zero_reg));
1795 // Fall through to success 1799 // Fall through to success
1796 1800
1797 __ bind(&success); 1801 __ bind(&success);
1798 __ Ulw(t0, MemOperand(a0, in_offset)); 1802 __ Ulw(t0, MemOperand(a0, in_offset));
1799 __ Usw(t0, MemOperand(a0, out_offset)); 1803 __ Usw(t0, MemOperand(a0, out_offset));
1800 __ Branch(&end); 1804 __ Branch(&end);
1801 __ bind(&fail); 1805 __ bind(&fail);
1802 __ Usw(zero_reg, MemOperand(a0, out_offset)); 1806 __ Usw(zero_reg, MemOperand(a0, out_offset));
1803 __ bind(&end); 1807 __ bind(&end);
1804 })); 1808 };
1809 CHECK_EQ(true, run_Unaligned<uint32_t>(buffer_middle, in_offset,
1810 out_offset, value, fn));
1805 } 1811 }
1806 } 1812 }
1807 } 1813 }
1808 } 1814 }
1809 1815
1810 TEST(Uld) { 1816 TEST(Uld) {
1811 CcTest::InitializeVM(); 1817 CcTest::InitializeVM();
1812 1818
1813 static const int kBufferSize = 300 * KB; 1819 static const int kBufferSize = 300 * KB;
1814 char memory_buffer[kBufferSize]; 1820 char memory_buffer[kBufferSize];
1815 char* buffer_middle = memory_buffer + (kBufferSize / 2); 1821 char* buffer_middle = memory_buffer + (kBufferSize / 2);
1816 1822
1817 FOR_UINT64_INPUTS(i, unsigned_test_values) { 1823 FOR_UINT64_INPUTS(i, unsigned_test_values) {
1818 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) { 1824 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) {
1819 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) { 1825 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) {
1820 uint64_t value = *i; 1826 uint64_t value = *i;
1821 int32_t in_offset = *j1 + *k1; 1827 int32_t in_offset = *j1 + *k1;
1822 int32_t out_offset = *j2 + *k2; 1828 int32_t out_offset = *j2 + *k2;
1823 1829
1824 CHECK_EQ(true, run_Unaligned<uint64_t>( 1830 auto fn_1 = [](MacroAssembler* masm, int32_t in_offset,
1825 buffer_middle, in_offset, out_offset, value, 1831 int32_t out_offset) {
1826 [](MacroAssembler* masm, int32_t in_offset, 1832 __ Uld(v0, MemOperand(a0, in_offset));
1827 int32_t out_offset) { 1833 __ Usd(v0, MemOperand(a0, out_offset));
1828 __ Uld(v0, MemOperand(a0, in_offset)); 1834 };
1829 __ Usd(v0, MemOperand(a0, out_offset)); 1835 CHECK_EQ(true, run_Unaligned<uint64_t>(buffer_middle, in_offset,
1830 })); 1836 out_offset, value, fn_1));
1837
1838 auto fn_2 = [](MacroAssembler* masm, int32_t in_offset,
1839 int32_t out_offset) {
1840 __ mov(t0, a0);
1841 __ Uld(a0, MemOperand(a0, in_offset));
1842 __ Usd(a0, MemOperand(t0, out_offset));
1843 };
1831 CHECK_EQ(true, 1844 CHECK_EQ(true,
1832 run_Unaligned<uint64_t>( 1845 run_Unaligned<uint64_t>(buffer_middle, in_offset, out_offset,
1833 buffer_middle, in_offset, out_offset, (uint32_t)value, 1846 (uint32_t)value, fn_2));
1834 [](MacroAssembler* masm, int32_t in_offset,
1835 int32_t out_offset) {
1836 __ mov(t0, a0);
1837 __ Uld(a0, MemOperand(a0, in_offset));
1838 __ Usd(a0, MemOperand(t0, out_offset));
1839 }));
1840 } 1847 }
1841 } 1848 }
1842 } 1849 }
1843 } 1850 }
1844 1851
1845 TEST(Ulwc1) { 1852 TEST(Ulwc1) {
1846 CcTest::InitializeVM(); 1853 CcTest::InitializeVM();
1847 1854
1848 static const int kBufferSize = 300 * KB; 1855 static const int kBufferSize = 300 * KB;
1849 char memory_buffer[kBufferSize]; 1856 char memory_buffer[kBufferSize];
1850 char* buffer_middle = memory_buffer + (kBufferSize / 2); 1857 char* buffer_middle = memory_buffer + (kBufferSize / 2);
1851 1858
1852 FOR_UINT64_INPUTS(i, unsigned_test_values) { 1859 FOR_UINT64_INPUTS(i, unsigned_test_values) {
1853 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) { 1860 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) {
1854 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) { 1861 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) {
1855 float value = static_cast<float>(*i & 0xFFFFFFFF); 1862 float value = static_cast<float>(*i & 0xFFFFFFFF);
1856 int32_t in_offset = *j1 + *k1; 1863 int32_t in_offset = *j1 + *k1;
1857 int32_t out_offset = *j2 + *k2; 1864 int32_t out_offset = *j2 + *k2;
1858 1865
1859 CHECK_EQ(true, run_Unaligned<float>( 1866 auto fn = [](MacroAssembler* masm, int32_t in_offset,
1860 buffer_middle, in_offset, out_offset, value, 1867 int32_t out_offset) {
1861 [](MacroAssembler* masm, int32_t in_offset, 1868 __ Ulwc1(f0, MemOperand(a0, in_offset), t0);
1862 int32_t out_offset) { 1869 __ Uswc1(f0, MemOperand(a0, out_offset), t0);
1863 __ Ulwc1(f0, MemOperand(a0, in_offset), t0); 1870 };
1864 __ Uswc1(f0, MemOperand(a0, out_offset), t0); 1871 CHECK_EQ(true, run_Unaligned<float>(buffer_middle, in_offset,
1865 })); 1872 out_offset, value, fn));
1866 } 1873 }
1867 } 1874 }
1868 } 1875 }
1869 } 1876 }
1870 1877
1871 TEST(Uldc1) { 1878 TEST(Uldc1) {
1872 CcTest::InitializeVM(); 1879 CcTest::InitializeVM();
1873 1880
1874 static const int kBufferSize = 300 * KB; 1881 static const int kBufferSize = 300 * KB;
1875 char memory_buffer[kBufferSize]; 1882 char memory_buffer[kBufferSize];
1876 char* buffer_middle = memory_buffer + (kBufferSize / 2); 1883 char* buffer_middle = memory_buffer + (kBufferSize / 2);
1877 1884
1878 FOR_UINT64_INPUTS(i, unsigned_test_values) { 1885 FOR_UINT64_INPUTS(i, unsigned_test_values) {
1879 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) { 1886 FOR_INT32_INPUTS2(j1, j2, unsigned_test_offset) {
1880 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) { 1887 FOR_INT32_INPUTS2(k1, k2, unsigned_test_offset_increment) {
1881 double value = static_cast<double>(*i); 1888 double value = static_cast<double>(*i);
1882 int32_t in_offset = *j1 + *k1; 1889 int32_t in_offset = *j1 + *k1;
1883 int32_t out_offset = *j2 + *k2; 1890 int32_t out_offset = *j2 + *k2;
1884 1891
1885 CHECK_EQ(true, run_Unaligned<double>( 1892 auto fn = [](MacroAssembler* masm, int32_t in_offset,
1886 buffer_middle, in_offset, out_offset, value, 1893 int32_t out_offset) {
1887 [](MacroAssembler* masm, int32_t in_offset, 1894 __ Uldc1(f0, MemOperand(a0, in_offset), t0);
1888 int32_t out_offset) { 1895 __ Usdc1(f0, MemOperand(a0, out_offset), t0);
1889 __ Uldc1(f0, MemOperand(a0, in_offset), t0); 1896 };
1890 __ Usdc1(f0, MemOperand(a0, out_offset), t0); 1897 CHECK_EQ(true, run_Unaligned<double>(buffer_middle, in_offset,
1891 })); 1898 out_offset, value, fn));
1892 } 1899 }
1893 } 1900 }
1894 } 1901 }
1895 } 1902 }
1896 1903
1897 static const std::vector<uint64_t> sltu_test_values() { 1904 static const std::vector<uint64_t> sltu_test_values() {
1898 static const uint64_t kValues[] = { 1905 static const uint64_t kValues[] = {
1899 0, 1906 0,
1900 1, 1907 1,
1901 0x7ffe, 1908 0x7ffe,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 } 1947 }
1941 1948
1942 TEST(Sltu) { 1949 TEST(Sltu) {
1943 CcTest::InitializeVM(); 1950 CcTest::InitializeVM();
1944 1951
1945 FOR_UINT64_INPUTS(i, sltu_test_values) { 1952 FOR_UINT64_INPUTS(i, sltu_test_values) {
1946 FOR_UINT64_INPUTS(j, sltu_test_values) { 1953 FOR_UINT64_INPUTS(j, sltu_test_values) {
1947 uint64_t rs = *i; 1954 uint64_t rs = *i;
1948 uint64_t rd = *j; 1955 uint64_t rd = *j;
1949 1956
1950 CHECK_EQ(rs < rd, run_Sltu(rs, rd, 1957 auto fn_1 = [](MacroAssembler* masm, uint64_t imm) {
1951 [](MacroAssembler* masm, uint64_t imm) { 1958 __ Sltu(v0, a0, Operand(imm));
1952 __ Sltu(v0, a0, Operand(imm)); 1959 };
1953 })); 1960 CHECK_EQ(rs < rd, run_Sltu(rs, rd, fn_1));
1954 CHECK_EQ(rs < rd, 1961
1955 run_Sltu(rs, rd, [](MacroAssembler* masm, 1962 auto fn_2 = [](MacroAssembler* masm, uint64_t imm) {
1956 uint64_t imm) { __ Sltu(v0, a0, a1); })); 1963 __ Sltu(v0, a0, a1);
1964 };
1965 CHECK_EQ(rs < rd, run_Sltu(rs, rd, fn_2));
1957 } 1966 }
1958 } 1967 }
1959 } 1968 }
1960 1969
1961 #undef __ 1970 #undef __
OLDNEW
« no previous file with comments | « test/cctest/test-macro-assembler-mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698