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

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

Issue 1119203003: MIPS: Add float instructions and test coverage, part one (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 1437 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 1448
1449 typedef struct test { 1449 typedef struct test {
1450 int a; 1450 int a;
1451 int b; 1451 int b;
1452 int c; 1452 int c;
1453 int d; 1453 int d;
1454 double e; 1454 double e;
1455 double f; 1455 double f;
1456 double g; 1456 double g;
1457 double h; 1457 double h;
1458 float i;
1459 float j;
1460 float k;
1461 float l;
1458 } Test; 1462 } Test;
1459 1463
1460 Test test; 1464 Test test;
1461 // Integer part of test. 1465 // Integer part of test.
1462 __ addiu(t1, zero_reg, 1); // t1 = 1 1466 __ addiu(t1, zero_reg, 1); // t1 = 1
1463 __ seleqz(t3, t1, zero_reg); // t3 = 1 1467 __ seleqz(t3, t1, zero_reg); // t3 = 1
1464 __ sw(t3, MemOperand(a0, OFFSET_OF(Test, a))); // a = 1 1468 __ sw(t3, MemOperand(a0, OFFSET_OF(Test, a))); // a = 1
1465 __ seleqz(t2, t1, t1); // t2 = 0 1469 __ seleqz(t2, t1, t1); // t2 = 0
1466 __ sw(t2, MemOperand(a0, OFFSET_OF(Test, b))); // b = 0 1470 __ sw(t2, MemOperand(a0, OFFSET_OF(Test, b))); // b = 0
1467 __ selnez(t3, t1, zero_reg); // t3 = 1; 1471 __ selnez(t3, t1, zero_reg); // t3 = 1;
1468 __ sw(t3, MemOperand(a0, OFFSET_OF(Test, c))); // c = 0 1472 __ sw(t3, MemOperand(a0, OFFSET_OF(Test, c))); // c = 0
1469 __ selnez(t3, t1, t1); // t3 = 1 1473 __ selnez(t3, t1, t1); // t3 = 1
1470 __ sw(t3, MemOperand(a0, OFFSET_OF(Test, d))); // d = 1 1474 __ sw(t3, MemOperand(a0, OFFSET_OF(Test, d))); // d = 1
1471 // Floating point part of test. 1475 // Floating point part of test.
1472 __ ldc1(f0, MemOperand(a0, OFFSET_OF(Test, e)) ); // src 1476 __ ldc1(f0, MemOperand(a0, OFFSET_OF(Test, e)) ); // src
1473 __ ldc1(f2, MemOperand(a0, OFFSET_OF(Test, f)) ); // test 1477 __ ldc1(f2, MemOperand(a0, OFFSET_OF(Test, f)) ); // test
1478 __ lwc1(f8, MemOperand(a0, OFFSET_OF(Test, i)) ); // src
1479 __ lwc1(f10, MemOperand(a0, OFFSET_OF(Test, j)) ); // test
1474 __ seleqz(D, f4, f0, f2); 1480 __ seleqz(D, f4, f0, f2);
1475 __ selnez(D, f6, f0, f2); 1481 __ selnez(D, f6, f0, f2);
1482 __ seleqz(S, f12, f8, f10);
1483 __ selnez(S, f14, f8, f10);
1476 __ sdc1(f4, MemOperand(a0, OFFSET_OF(Test, g)) ); // src 1484 __ sdc1(f4, MemOperand(a0, OFFSET_OF(Test, g)) ); // src
1477 __ sdc1(f6, MemOperand(a0, OFFSET_OF(Test, h)) ); // src 1485 __ sdc1(f6, MemOperand(a0, OFFSET_OF(Test, h)) ); // src
1486 __ swc1(f12, MemOperand(a0, OFFSET_OF(Test, k)) ); // src
1487 __ swc1(f14, MemOperand(a0, OFFSET_OF(Test, l)) ); // src
1478 __ jr(ra); 1488 __ jr(ra);
1479 __ nop(); 1489 __ nop();
1480 CodeDesc desc; 1490 CodeDesc desc;
1481 assm.GetCode(&desc); 1491 assm.GetCode(&desc);
1482 Handle<Code> code = isolate->factory()->NewCode( 1492 Handle<Code> code = isolate->factory()->NewCode(
1483 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1493 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1484 F3 f = FUNCTION_CAST<F3>(code->entry()); 1494 F3 f = FUNCTION_CAST<F3>(code->entry());
1485 1495
1486 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1496 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1487 1497
1488 CHECK_EQ(test.a, 1); 1498 CHECK_EQ(test.a, 1);
1489 CHECK_EQ(test.b, 0); 1499 CHECK_EQ(test.b, 0);
1490 CHECK_EQ(test.c, 0); 1500 CHECK_EQ(test.c, 0);
1491 CHECK_EQ(test.d, 1); 1501 CHECK_EQ(test.d, 1);
1492 1502
1493 const int test_size = 3; 1503 const int test_size = 3;
1494 const int input_size = 5; 1504 const int input_size = 5;
1495 1505
1496 double inputs[input_size] = {0.0, 65.2, -70.32, 1506 double inputs_D[input_size] = {0.0, 65.2, -70.32,
1497 18446744073709551621.0, -18446744073709551621.0}; 1507 18446744073709551621.0, -18446744073709551621.0};
1498 double outputs[input_size] = {0.0, 65.2, -70.32, 1508 double outputs_D[input_size] = {0.0, 65.2, -70.32,
1499 18446744073709551621.0, -18446744073709551621.0}; 1509 18446744073709551621.0, -18446744073709551621.0};
1500 double tests[test_size*2] = {2.8, 2.9, -2.8, -2.9, 1510 double tests_D[test_size*2] = {2.8, 2.9, -2.8, -2.9,
1501 18446744073709551616.0, 18446744073709555712.0}; 1511 18446744073709551616.0, 18446744073709555712.0};
1502 for (int j=0;j < test_size;j+=2) { 1512 float inputs_S[input_size] = {0.0, 65.2, -70.32,
1503 for (int i=0;i < input_size;i++) { 1513 18446744073709551621.0, -18446744073709551621.0};
1504 test.e = inputs[i]; 1514 float outputs_S[input_size] = {0.0, 65.2, -70.32,
1505 test.f = tests[j]; 1515 18446744073709551621.0, -18446744073709551621.0};
1516 float tests_S[test_size*2] = {2.9, 2.8, -2.9, -2.8,
1517 18446744073709551616.0, 18446746272732807168.0};
1518 for (int j=0; j < test_size; j+=2) {
1519 for (int i=0; i < input_size; i++) {
1520 test.e = inputs_D[i];
1521 test.f = tests_D[j];
1522 test.i = inputs_S[i];
1523 test.j = tests_S[j];
1506 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1524 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1507 CHECK_EQ(test.g, outputs[i]); 1525 CHECK_EQ(test.g, outputs_D[i]);
1508 CHECK_EQ(test.h, 0); 1526 CHECK_EQ(test.h, 0);
1527 CHECK_EQ(test.k, outputs_S[i]);
1528 CHECK_EQ(test.l, 0);
1509 1529
1510 test.f = tests[j+1]; 1530 test.f = tests_D[j+1];
1531 test.j = tests_S[j+1];
1511 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1532 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1512 CHECK_EQ(test.g, 0); 1533 CHECK_EQ(test.g, 0);
1513 CHECK_EQ(test.h, outputs[i]); 1534 CHECK_EQ(test.h, outputs_D[i]);
1535 CHECK_EQ(test.k, 0);
1536 CHECK_EQ(test.l, outputs_S[i]);
1514 } 1537 }
1515 } 1538 }
1516 } 1539 }
1517 } 1540 }
1518 1541
1519 1542
1520 TEST(MIPS18) { 1543 TEST(MIPS18) {
1521 if (kArchVariant == kMips64r6) { 1544 if (kArchVariant == kMips64r6) {
1522 CcTest::InitializeVM(); 1545 CcTest::InitializeVM();
1523 Isolate* isolate = CcTest::i_isolate(); 1546 Isolate* isolate = CcTest::i_isolate();
1524 HandleScope scope(isolate); 1547 HandleScope scope(isolate);
1525 MacroAssembler assm(isolate, NULL, 0); 1548 MacroAssembler assm(isolate, NULL, 0);
1526 1549
1527 typedef struct test_float { 1550 typedef struct test_float {
1528 double a; 1551 double a;
1529 double b; 1552 double b;
1530 double c; 1553 double c;
1531 double d; 1554 double d;
1555 float e;
1556 float f;
1557 float g;
1558 float h;
1532 } TestFloat; 1559 } TestFloat;
1533 1560
1534 TestFloat test; 1561 TestFloat test;
1562 const double dblNaN = std::numeric_limits<double>::quiet_NaN();
1563 const float fltNaN = std::numeric_limits<float>::quiet_NaN();
1564 const int tableLength = 5;
1565 double inputsa[tableLength] = {2.0, 3.0, dblNaN, 3.0, dblNaN};
1566 double inputsb[tableLength] = {3.0, 2.0, 3.0, dblNaN, dblNaN};
1567 double outputsdmin[tableLength] = {2.0, 2.0, 3.0, 3.0, dblNaN};
1568 double outputsdmax[tableLength] = {3.0, 3.0, 3.0, 3.0, dblNaN};
1569
1570 float inputse[tableLength] = {2.0, 3.0, fltNaN, 3.0, fltNaN};
1571 float inputsf[tableLength] = {3.0, 2.0, 3.0, fltNaN, fltNaN};
1572 float outputsfmin[tableLength] = {2.0, 2.0, 3.0, 3.0, fltNaN};
1573 float outputsfmax[tableLength] = {3.0, 3.0, 3.0, 3.0, fltNaN};
1535 1574
1536 __ ldc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, a))); 1575 __ ldc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, a)));
1537 __ ldc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b))); 1576 __ ldc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b)));
1577 __ lwc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, e)));
1578 __ lwc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, f)));
1538 __ min_d(f10, f4, f8); 1579 __ min_d(f10, f4, f8);
1539 __ max_d(f12, f4, f8); 1580 __ max_d(f12, f4, f8);
1581 __ min_s(f14, f2, f6);
1582 __ max_s(f16, f2, f6);
1540 __ sdc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, c))); 1583 __ sdc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, c)));
1541 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, d))); 1584 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, d)));
1585 __ swc1(f14, MemOperand(a0, OFFSET_OF(TestFloat, g)));
1586 __ swc1(f16, MemOperand(a0, OFFSET_OF(TestFloat, h)));
1542 __ jr(ra); 1587 __ jr(ra);
1543 __ nop(); 1588 __ nop();
1544 1589
1545 CodeDesc desc; 1590 CodeDesc desc;
1546 assm.GetCode(&desc); 1591 assm.GetCode(&desc);
1547 Handle<Code> code = isolate->factory()->NewCode( 1592 Handle<Code> code = isolate->factory()->NewCode(
1548 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1593 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1549 F3 f = FUNCTION_CAST<F3>(code->entry()); 1594 F3 f = FUNCTION_CAST<F3>(code->entry());
1550 test.a = 2.0; // a goes to fs 1595 for (int i = 0; i < tableLength; i++) {
1551 test.b = 3.0; // b goes to ft 1596 test.a = inputsa[i];
1552 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1597 test.b = inputsb[i];
1553 CHECK_EQ(test.c, 2.0); 1598 test.e = inputse[i];
1554 CHECK_EQ(test.d, 3.0); 1599 test.f = inputsf[i];
1555 1600
1556 test.a = 3.0; // a goes to fs 1601 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1557 test.b = 2.0; // b goes to ft
1558 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1559 CHECK_EQ(test.c, 2.0);
1560 CHECK_EQ(test.d, 3.0);
1561 1602
1562 test.a = std::numeric_limits<double>::quiet_NaN(); 1603 if (i < tableLength - 1) {
1563 test.b = 3.0; // b goes to ft 1604 CHECK_EQ(test.c, outputsdmin[i]);
1564 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1605 CHECK_EQ(test.d, outputsdmax[i]);
1565 CHECK_EQ(test.c, 3.0); 1606 CHECK_EQ(test.g, outputsfmin[i]);
1566 CHECK_EQ(test.d, 3.0); 1607 CHECK_EQ(test.h, outputsfmax[i]);
1567 1608 } else {
1568 test.b = std::numeric_limits<double>::quiet_NaN(); 1609 DCHECK(std::isnan(test.c));
1569 test.a = 3.0; // b goes to ft 1610 DCHECK(std::isnan(test.d));
1570 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1611 DCHECK(std::isnan(test.g));
1571 CHECK_EQ(test.c, 3.0); 1612 DCHECK(std::isnan(test.h));
1572 CHECK_EQ(test.d, 3.0); 1613 }
1573 1614 }
1574 test.a = std::numeric_limits<double>::quiet_NaN();
1575 test.b = std::numeric_limits<double>::quiet_NaN();
1576 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1577 DCHECK(std::isnan(test.c));
1578 DCHECK(std::isnan(test.d));
1579 } 1615 }
1580 } 1616 }
1581 1617
1582 1618
1583 TEST(MIPS19) { 1619 TEST(MIPS19) {
1584 if (kArchVariant == kMips64r6) { 1620 if (kArchVariant == kMips64r6) {
1585 const int tableLength = 30; 1621 const int tableLength = 30;
1586 CcTest::InitializeVM(); 1622 CcTest::InitializeVM();
1587 Isolate* isolate = CcTest::i_isolate(); 1623 Isolate* isolate = CcTest::i_isolate();
1588 HandleScope scope(isolate); 1624 HandleScope scope(isolate);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1665 __ sdc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b)) ); 1701 __ sdc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
1666 __ jr(ra); 1702 __ jr(ra);
1667 __ nop(); 1703 __ nop();
1668 1704
1669 CodeDesc desc; 1705 CodeDesc desc;
1670 assm.GetCode(&desc); 1706 assm.GetCode(&desc);
1671 Handle<Code> code = isolate->factory()->NewCode( 1707 Handle<Code> code = isolate->factory()->NewCode(
1672 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1708 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1673 F3 f = FUNCTION_CAST<F3>(code->entry()); 1709 F3 f = FUNCTION_CAST<F3>(code->entry());
1674 1710
1675 for (int j = 0;j < 4;j++) { 1711 for (int j = 0; j < 4; j++) {
1676 test.fcsr = fcsr_inputs[j]; 1712 test.fcsr = fcsr_inputs[j];
1677 for (int i = 0;i < tableLength;i++) { 1713 for (int i = 0; i < tableLength; i++) {
1678 test.a = inputs[i]; 1714 test.a = inputs[i];
1679 std::cout << j << " " << i << "\n";
1680 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1715 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1681 CHECK_EQ(test.b, outputs[j][i]); 1716 CHECK_EQ(test.b, outputs[j][i]);
1682 } 1717 }
1683 } 1718 }
1684 } 1719 }
1685 } 1720 }
1686 1721
1687 1722
1688 TEST(MIPS20) { 1723 TEST(MIPS20) {
1689 CcTest::InitializeVM(); 1724 CcTest::InitializeVM();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1744 __ swc1(f8, MemOperand(a0, OFFSET_OF(Test, b)) ); 1779 __ swc1(f8, MemOperand(a0, OFFSET_OF(Test, b)) );
1745 __ ctc1(t1, FCSR); 1780 __ ctc1(t1, FCSR);
1746 __ jr(ra); 1781 __ jr(ra);
1747 __ nop(); 1782 __ nop();
1748 Test test; 1783 Test test;
1749 CodeDesc desc; 1784 CodeDesc desc;
1750 assm.GetCode(&desc); 1785 assm.GetCode(&desc);
1751 Handle<Code> code = isolate->factory()->NewCode( 1786 Handle<Code> code = isolate->factory()->NewCode(
1752 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1787 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1753 F3 f = FUNCTION_CAST<F3>(code->entry()); 1788 F3 f = FUNCTION_CAST<F3>(code->entry());
1754 for (int j = 0;j < 4;j++) { 1789 for (int j = 0; j < 4; j++) {
1755 test.fcsr = fcsr_inputs[j]; 1790 test.fcsr = fcsr_inputs[j];
1756 for (int i = 0;i < tableLength;i++) { 1791 for (int i = 0; i < tableLength; i++) {
1757 test.a = inputs[i]; 1792 test.a = inputs[i];
1758 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1793 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1759 CHECK_EQ(test.b, outputs[j][i]); 1794 CHECK_EQ(test.b, outputs[j][i]);
1760 } 1795 }
1761 } 1796 }
1762 } 1797 }
1763 1798
1764 1799
1765 TEST(MIPS21) { 1800 TEST(MIPS21) {
1766 if (kArchVariant == kMips64r6) { 1801 if (kArchVariant == kMips64r6) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1848 __ sdc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b)) ); 1883 __ sdc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
1849 __ ctc1(t1, FCSR); 1884 __ ctc1(t1, FCSR);
1850 __ jr(ra); 1885 __ jr(ra);
1851 __ nop(); 1886 __ nop();
1852 1887
1853 CodeDesc desc; 1888 CodeDesc desc;
1854 assm.GetCode(&desc); 1889 assm.GetCode(&desc);
1855 Handle<Code> code = isolate->factory()->NewCode( 1890 Handle<Code> code = isolate->factory()->NewCode(
1856 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 1891 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1857 F3 f = FUNCTION_CAST<F3>(code->entry()); 1892 F3 f = FUNCTION_CAST<F3>(code->entry());
1858 for (int j = 0;j < 4;j++) { 1893 for (int j = 0; j < 4; j++) {
1859 test.fcsr = fcsr_inputs[j]; 1894 test.fcsr = fcsr_inputs[j];
1860 for (int i = 0;i < tableLength;i++) { 1895 for (int i = 0; i < tableLength; i++) {
1861 test.a = inputs[i]; 1896 test.a = inputs[i];
1862 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); 1897 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1863 CHECK_EQ(test.b, outputs[j][i]); 1898 CHECK_EQ(test.b, outputs[j][i]);
1864 } 1899 }
1865 } 1900 }
1866 } 1901 }
1867 } 1902 }
1868 1903
1869 1904
1905 TEST(MIPS22) {
1906 CcTest::InitializeVM();
1907 Isolate* isolate = CcTest::i_isolate();
1908 HandleScope scope(isolate);
1909 MacroAssembler assm(isolate, NULL, 0);
1910
1911 typedef struct test_float {
1912 double a;
1913 float b;
1914 int32_t c; // a trunc result
1915 int32_t d; // b trunc result
1916 }Test;
1917 const int tableLength = 15;
1918 double inputs_D[tableLength] = {
1919 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
1920 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
1921 2147483648.0,
1922 std::numeric_limits<double>::quiet_NaN(),
1923 std::numeric_limits<double>::infinity()
1924 };
1925 float inputs_S[tableLength] = {
1926 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
1927 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
1928 2147483648.0,
1929 std::numeric_limits<float>::quiet_NaN(),
1930 std::numeric_limits<float>::infinity()
1931 };
1932 double outputs[tableLength] = {
1933 2.0, 2.0, 2.0, 3.0, 3.0, 3.0,
1934 -2.0, -2.0, -2.0, -3.0, -3.0, -3.0,
1935 kFPUInvalidResult, kFPUInvalidResult,
1936 kFPUInvalidResult};
1937
1938 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
1939 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
1940 __ trunc_w_d(f8, f4);
1941 __ trunc_w_s(f10, f6);
1942 __ swc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
1943 __ swc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
1944 __ jr(ra);
1945 __ nop();
1946 Test test;
1947 CodeDesc desc;
1948 assm.GetCode(&desc);
1949 Handle<Code> code = isolate->factory()->NewCode(
1950 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1951 F3 f = FUNCTION_CAST<F3>(code->entry());
1952 for (int i = 0; i < tableLength; i++) {
1953 test.a = inputs_D[i];
1954 test.b = inputs_S[i];
1955 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
1956 CHECK_EQ(test.c, outputs[i]);
1957 CHECK_EQ(test.d, test.c);
1958 }
1959 }
1960
1961
1962 TEST(MIPS39) {
1963 if (kArchVariant == kMips64r2) {
1964 CcTest::InitializeVM();
1965 Isolate* isolate = CcTest::i_isolate();
1966 HandleScope scope(isolate);
1967 MacroAssembler assm(isolate, NULL, 0);
1968 const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult);
1969 typedef struct test_float {
1970 double a;
1971 float b;
1972 int64_t c; // a trunc result
1973 int64_t d; // b trunc result
1974 }Test;
1975 const int tableLength = 16;
1976 double inputs_D[tableLength] = {
1977 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
1978 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
1979 2147483648.0,
1980 std::numeric_limits<double>::quiet_NaN(),
1981 std::numeric_limits<double>::infinity(),
1982 9223372036854775808.0
1983 };
1984 float inputs_S[tableLength] = {
1985 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
1986 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
1987 2147483648.0,
1988 std::numeric_limits<float>::quiet_NaN(),
1989 std::numeric_limits<float>::infinity(),
1990 9223372036854775808.0
1991 };
1992 double outputs[tableLength] = {
1993 2.0, 2.0, 2.0, 3.0, 3.0, 3.0,
1994 -2.0, -2.0, -2.0, -3.0, -3.0, -3.0,
1995 2147483648.0, dFPU64InvalidResult,
1996 dFPU64InvalidResult, dFPU64InvalidResult};
1997
1998 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
1999 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
2000 __ trunc_l_d(f8, f4);
2001 __ trunc_l_s(f10, f6);
2002 __ sdc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
2003 __ sdc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
2004 __ jr(ra);
2005 __ nop();
2006 Test test;
2007 CodeDesc desc;
2008 assm.GetCode(&desc);
2009 Handle<Code> code = isolate->factory()->NewCode(
2010 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2011 F3 f = FUNCTION_CAST<F3>(code->entry());
2012 for (int i = 0; i < tableLength; i++) {
2013 test.a = inputs_D[i];
2014 test.b = inputs_S[i];
2015 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2016 CHECK_EQ(test.c, outputs[i]);
2017 CHECK_EQ(test.d, test.c);
2018 }
2019 }
2020 }
2021
2022
2023 TEST(MIPS23) {
2024 if (kArchVariant == kMips64r6) {
2025 CcTest::InitializeVM();
2026 Isolate* isolate = CcTest::i_isolate();
2027 HandleScope scope(isolate);
2028 MacroAssembler assm(isolate, NULL, 0);
2029
2030 typedef struct test {
2031 double dd;
2032 double ds;
2033 double dt;
2034 float fd;
2035 float fs;
2036 float ft;
2037 } Test;
2038
2039 Test test;
2040 __ ldc1(f0, MemOperand(a0, OFFSET_OF(Test, dd)) ); // test
2041 __ ldc1(f2, MemOperand(a0, OFFSET_OF(Test, ds)) ); // src1
2042 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, dt)) ); // src2
2043 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, fd)) ); // test
2044 __ lwc1(f8, MemOperand(a0, OFFSET_OF(Test, fs)) ); // src1
2045 __ lwc1(f10, MemOperand(a0, OFFSET_OF(Test, ft)) ); // src2
2046 __ sel(D, f0, f2, f4);
2047 __ sel(S, f6, f8, f10);
2048 __ sdc1(f0, MemOperand(a0, OFFSET_OF(Test, dd)) );
2049 __ swc1(f6, MemOperand(a0, OFFSET_OF(Test, fd)) );
2050 __ jr(ra);
2051 __ nop();
2052 CodeDesc desc;
2053 assm.GetCode(&desc);
2054 Handle<Code> code = isolate->factory()->NewCode(
2055 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2056 F3 f = FUNCTION_CAST<F3>(code->entry());
2057
2058 const int test_size = 3;
2059 const int input_size = 5;
2060
2061 double inputs_dt[input_size] = {0.0, 65.2, -70.32,
2062 18446744073709551621.0, -18446744073709551621.0};
2063 double inputs_ds[input_size] = {0.1, 69.88, -91.325,
2064 18446744073709551625.0, -18446744073709551625.0};
2065 float inputs_ft[input_size] = {0.0, 65.2, -70.32,
2066 18446744073709551621.0, -18446744073709551621.0};
2067 float inputs_fs[input_size] = {0.1, 69.88, -91.325,
2068 18446744073709551625.0, -18446744073709551625.0};
2069 double tests_D[test_size*2] = {2.8, 2.9, -2.8, -2.9,
2070 18446744073709551616.0, 18446744073709555712.0};
2071 float tests_S[test_size*2] = {2.9, 2.8, -2.9, -2.8,
2072 18446744073709551616.0, 18446746272732807168.0};
2073 for (int j=0; j < test_size; j+=2) {
2074 for (int i=0; i < input_size; i++) {
2075 test.dt = inputs_dt[i];
2076 test.dd = tests_D[j];
2077 test.ds = inputs_ds[i];
2078 test.ft = inputs_ft[i];
2079 test.fd = tests_S[j];
2080 test.fs = inputs_fs[i];
2081 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2082 CHECK_EQ(test.dd, inputs_ds[i]);
2083 CHECK_EQ(test.fd, inputs_fs[i]);
2084
2085 test.dd = tests_D[j+1];
2086 test.fd = tests_S[j+1];
2087 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2088 CHECK_EQ(test.dd, inputs_dt[i]);
2089 CHECK_EQ(test.fd, inputs_ft[i]);
2090 }
2091 }
2092 }
2093 }
2094
2095
2096 TEST(MIPS24) {
2097 CcTest::InitializeVM();
2098 Isolate* isolate = CcTest::i_isolate();
2099 HandleScope scope(isolate);
2100 MacroAssembler assm(isolate, NULL, 0);
2101
2102 typedef struct test_float {
2103 double a;
2104 float b;
2105 int32_t c; // a trunc result
2106 int32_t d; // b trunc result
2107 }Test;
2108 const int tableLength = 15;
2109 double inputs_D[tableLength] = {
2110 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
2111 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
2112 2147483648.0,
2113 std::numeric_limits<double>::quiet_NaN(),
2114 std::numeric_limits<double>::infinity()
2115 };
2116 float inputs_S[tableLength] = {
2117 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
2118 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
2119 2147483648.0,
2120 std::numeric_limits<float>::quiet_NaN(),
2121 std::numeric_limits<float>::infinity()
2122 };
2123 double outputs[tableLength] = {
2124 2.0, 3.0, 2.0, 3.0, 4.0, 4.0,
2125 -2.0, -3.0, -2.0, -3.0, -4.0, -4.0,
2126 kFPUInvalidResult, kFPUInvalidResult,
2127 kFPUInvalidResult};
2128
2129 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
2130 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
2131 __ round_w_d(f8, f4);
2132 __ round_w_s(f10, f6);
2133 __ swc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
2134 __ swc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
2135 __ jr(ra);
2136 __ nop();
2137 Test test;
2138 CodeDesc desc;
2139 assm.GetCode(&desc);
2140 Handle<Code> code = isolate->factory()->NewCode(
2141 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2142 F3 f = FUNCTION_CAST<F3>(code->entry());
2143 for (int i = 0; i < tableLength; i++) {
2144 test.a = inputs_D[i];
2145 test.b = inputs_S[i];
2146 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2147 CHECK_EQ(test.c, outputs[i]);
2148 CHECK_EQ(test.d, test.c);
2149 }
2150 }
2151
2152
2153 TEST(MIPS25) {
2154 CcTest::InitializeVM();
2155 Isolate* isolate = CcTest::i_isolate();
2156 HandleScope scope(isolate);
2157 MacroAssembler assm(isolate, NULL, 0);
2158 const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult);
2159 typedef struct test_float {
2160 double a;
2161 float b;
2162 int64_t c;
2163 int64_t d;
2164 }Test;
2165 const int tableLength = 16;
2166 double inputs_D[tableLength] = {
2167 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
2168 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
2169 2147483648.0,
2170 std::numeric_limits<double>::quiet_NaN(),
2171 std::numeric_limits<double>::infinity(),
2172 9223372036854775808.0
2173 };
2174 float inputs_S[tableLength] = {
2175 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
2176 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
2177 2147483648.0,
2178 std::numeric_limits<float>::quiet_NaN(),
2179 std::numeric_limits<float>::infinity(),
2180 9223372036854775808.0
2181 };
2182 double outputs[tableLength] = {
2183 2.0, 3.0, 2.0, 3.0, 4.0, 4.0,
2184 -2.0, -3.0, -2.0, -3.0, -4.0, -4.0,
2185 2147483648.0, dFPU64InvalidResult,
2186 dFPU64InvalidResult, dFPU64InvalidResult};
2187
2188 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
2189 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
2190 __ round_l_d(f8, f4);
2191 __ round_l_s(f10, f6);
2192 __ sdc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
2193 __ sdc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
2194 __ jr(ra);
2195 __ nop();
2196 Test test;
2197 CodeDesc desc;
2198 assm.GetCode(&desc);
2199 Handle<Code> code = isolate->factory()->NewCode(
2200 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2201 F3 f = FUNCTION_CAST<F3>(code->entry());
2202 for (int i = 0; i < tableLength; i++) {
2203 test.a = inputs_D[i];
2204 test.b = inputs_S[i];
2205 std::cout<< i<< "\n";
2206 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2207 CHECK_EQ(test.c, outputs[i]);
2208 CHECK_EQ(test.d, test.c);
2209 }
2210 }
2211
2212
2213 TEST(MIPS26) {
2214 if (kArchVariant == kMips64r6) {
2215 const int tableLength = 30;
2216 CcTest::InitializeVM();
2217 Isolate* isolate = CcTest::i_isolate();
2218 HandleScope scope(isolate);
2219 MacroAssembler assm(isolate, NULL, 0);
2220
2221 typedef struct test_float {
2222 float a;
2223 float b;
2224 int fcsr;
2225 }TestFloat;
2226
2227 TestFloat test;
2228 float inputs[tableLength] = {18446744073709551617.0,
2229 4503599627370496.0, -4503599627370496.0,
2230 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E37,
2231 1.7976931348623157E+38, 6.27463370218383111104242366943E-37,
2232 309485009821345068724781056.89,
2233 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
2234 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
2235 37778931862957161709568.0, 37778931862957161709569.0,
2236 37778931862957161709580.0, 37778931862957161709581.0,
2237 37778931862957161709582.0, 37778931862957161709583.0,
2238 37778931862957161709584.0, 37778931862957161709585.0,
2239 37778931862957161709586.0, 37778931862957161709587.0};
2240 float outputs_RN[tableLength] = {18446744073709551617.0,
2241 4503599627370496.0, -4503599627370496.0,
2242 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E37,
2243 1.7976931348623157E38, 0,
2244 309485009821345068724781057.0,
2245 2.0, 3.0, 2.0, 3.0, 4.0, 4.0,
2246 -2.0, -3.0, -2.0, -3.0, -4.0, -4.0,
2247 37778931862957161709568.0, 37778931862957161709569.0,
2248 37778931862957161709580.0, 37778931862957161709581.0,
2249 37778931862957161709582.0, 37778931862957161709583.0,
2250 37778931862957161709584.0, 37778931862957161709585.0,
2251 37778931862957161709586.0, 37778931862957161709587.0};
2252 float outputs_RZ[tableLength] = {18446744073709551617.0,
2253 4503599627370496.0, -4503599627370496.0,
2254 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E37,
2255 1.7976931348623157E38, 0,
2256 309485009821345068724781057.0,
2257 2.0, 2.0, 2.0, 3.0, 3.0, 3.0,
2258 -2.0, -2.0, -2.0, -3.0, -3.0, -3.0,
2259 37778931862957161709568.0, 37778931862957161709569.0,
2260 37778931862957161709580.0, 37778931862957161709581.0,
2261 37778931862957161709582.0, 37778931862957161709583.0,
2262 37778931862957161709584.0, 37778931862957161709585.0,
2263 37778931862957161709586.0, 37778931862957161709587.0};
2264 float outputs_RP[tableLength] = {18446744073709551617.0,
2265 4503599627370496.0, -4503599627370496.0,
2266 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E37,
2267 1.7976931348623157E38, 1,
2268 309485009821345068724781057.0,
2269 3.0, 3.0, 3.0, 4.0, 4.0, 4.0,
2270 -2.0, -2.0, -2.0, -3.0, -3.0, -3.0,
2271 37778931862957161709568.0, 37778931862957161709569.0,
2272 37778931862957161709580.0, 37778931862957161709581.0,
2273 37778931862957161709582.0, 37778931862957161709583.0,
2274 37778931862957161709584.0, 37778931862957161709585.0,
2275 37778931862957161709586.0, 37778931862957161709587.0};
2276 float outputs_RM[tableLength] = {18446744073709551617.0,
2277 4503599627370496.0, -4503599627370496.0,
2278 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E37,
2279 1.7976931348623157E38, 0,
2280 309485009821345068724781057.0,
2281 2.0, 2.0, 2.0, 3.0, 3.0, 3.0,
2282 -3.0, -3.0, -3.0, -4.0, -4.0, -4.0,
2283 37778931862957161709568.0, 37778931862957161709569.0,
2284 37778931862957161709580.0, 37778931862957161709581.0,
2285 37778931862957161709582.0, 37778931862957161709583.0,
2286 37778931862957161709584.0, 37778931862957161709585.0,
2287 37778931862957161709586.0, 37778931862957161709587.0};
2288 int fcsr_inputs[4] =
2289 {kRoundToNearest, kRoundToZero, kRoundToPlusInf, kRoundToMinusInf};
2290 float* outputs[4] = {outputs_RN, outputs_RZ, outputs_RP, outputs_RM};
2291 __ lwc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2292 __ lw(t0, MemOperand(a0, OFFSET_OF(TestFloat, fcsr)) );
2293 __ cfc1(t1, FCSR);
2294 __ ctc1(t0, FCSR);
2295 __ rint(S, f8, f4);
2296 __ swc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
2297 __ ctc1(t1, FCSR);
2298 __ jr(ra);
2299 __ nop();
2300
2301 CodeDesc desc;
2302 assm.GetCode(&desc);
2303 Handle<Code> code = isolate->factory()->NewCode(
2304 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2305 F3 f = FUNCTION_CAST<F3>(code->entry());
2306
2307 for (int j = 0; j < 4; j++) {
2308 test.fcsr = fcsr_inputs[j];
2309 for (int i = 0; i < tableLength; i++) {
2310 test.a = inputs[i];
2311 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2312 CHECK_EQ(test.b, outputs[j][i]);
2313 }
2314 }
2315 }
2316 }
2317
2318
2319 TEST(MIPS27) {
2320 const int tableLength = 12;
2321 CcTest::InitializeVM();
2322 Isolate* isolate = CcTest::i_isolate();
2323 HandleScope scope(isolate);
2324 MacroAssembler assm(isolate, NULL, 0);
2325
2326 typedef struct test_float {
2327 float a;
2328 float b;
2329 float resultS;
2330 double c;
2331 double d;
2332 double resultD;
2333 }TestFloat;
2334
2335 TestFloat test;
2336 double inputfs_D[tableLength] = {
2337 5.3, 4.8, 2.9, -5.3, -4.8, -2.9,
2338 5.3, 4.8, 2.9, -5.3, -4.8, -2.9
2339 };
2340 double inputft_D[tableLength] = {
2341 4.8, 5.3, 2.9, 4.8, 5.3, 2.9,
2342 -4.8, -5.3, -2.9, -4.8, -5.3, -2.9
2343 };
2344 double outputs_D[tableLength] = {
2345 0.5, -0.5, 0.0, -10.1, -10.1, -5.8,
2346 10.1, 10.1, 5.8, -0.5, 0.5, 0.0
2347 };
2348 float inputfs_S[tableLength] = {
2349 5.3, 4.8, 2.9, -5.3, -4.8, -2.9,
2350 5.3, 4.8, 2.9, -5.3, -4.8, -2.9
2351 };
2352 float inputft_S[tableLength] = {
2353 4.8, 5.3, 2.9, 4.8, 5.3, 2.9,
2354 -4.8, -5.3, -2.9, -4.8, -5.3, -2.9
2355 };
2356 float outputs_S[tableLength] = {
2357 0.5, -0.5, 0.0, -10.1, -10.1, -5.8,
2358 10.1, 10.1, 5.8, -0.5, 0.5, 0.0
2359 };
2360 __ lwc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2361 __ lwc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
2362 __ ldc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, c)) );
2363 __ ldc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, d)) );
2364 __ sub_s(f6, f2, f4);
2365 __ sub_d(f12, f8, f10);
2366 __ swc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, resultS)) );
2367 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, resultD)) );
2368 __ jr(ra);
2369 __ nop();
2370
2371 CodeDesc desc;
2372 assm.GetCode(&desc);
2373 Handle<Code> code = isolate->factory()->NewCode(
2374 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2375 F3 f = FUNCTION_CAST<F3>(code->entry());
2376 for (int i = 0; i < tableLength; i++) {
2377 test.a = inputfs_S[i];
2378 test.b = inputft_S[i];
2379 test.c = inputfs_D[i];
2380 test.d = inputft_D[i];
2381 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2382 CHECK_EQ(test.resultS, outputs_S[i]);
2383 CHECK_EQ(test.resultD, outputs_D[i]);
2384 }
2385 }
2386
2387
2388 TEST(MIPS28) {
2389 const int tableLength = 4;
2390 const double deltaDouble = 2E-15;
2391 const float deltaFloat = 2E-7;
2392 const float sqrt2_s = sqrt(2);
2393 const double sqrt2_d = sqrt(2);
2394 CcTest::InitializeVM();
2395 Isolate* isolate = CcTest::i_isolate();
2396 HandleScope scope(isolate);
2397 MacroAssembler assm(isolate, NULL, 0);
2398
2399 typedef struct test_float {
2400 float a;
2401 float resultS;
2402 float resultS1;
2403 float resultS2;
2404 double c;
2405 double resultD;
2406 double resultD1;
2407 double resultD2;
2408 }TestFloat;
2409 TestFloat test;
2410
2411 double inputs_D[tableLength] = {
2412 0.0L, 4.0L, 2.0L, 4e-28L
2413 };
2414
2415 double outputs_D[tableLength] = {
2416 0.0L, 2.0L, sqrt2_d, 2e-14L
2417 };
2418 float inputs_S[tableLength] = {
2419 0.0, 4.0, 2.0, 4e-28
2420 };
2421
2422 float outputs_S[tableLength] = {
2423 0.0, 2.0, sqrt2_s, 2e-14
2424 };
2425
2426
2427 __ lwc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2428 __ ldc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, c)) );
2429 __ sqrt_s(f6, f2);
2430 __ sqrt_d(f12, f8);
2431 __ rsqrt_d(f14, f8);
2432 __ rsqrt_s(f16, f2);
2433 __ recip_d(f18, f8);
2434 __ recip_s(f20, f2);
2435 __ swc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, resultS)) );
2436 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, resultD)) );
2437 __ swc1(f16, MemOperand(a0, OFFSET_OF(TestFloat, resultS1)) );
2438 __ sdc1(f14, MemOperand(a0, OFFSET_OF(TestFloat, resultD1)) );
2439 __ swc1(f20, MemOperand(a0, OFFSET_OF(TestFloat, resultS2)) );
2440 __ sdc1(f18, MemOperand(a0, OFFSET_OF(TestFloat, resultD2)) );
2441 __ jr(ra);
2442 __ nop();
2443
2444 CodeDesc desc;
2445 assm.GetCode(&desc);
2446 Handle<Code> code = isolate->factory()->NewCode(
2447 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2448 F3 f = FUNCTION_CAST<F3>(code->entry());
2449
2450 for (int i = 0; i < tableLength; i++) {
2451 float f1;
2452 double d1;
2453 test.a = inputs_S[i];
2454 test.c = inputs_D[i];
2455
2456 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2457
2458 CHECK_EQ(test.resultS, outputs_S[i]);
2459 CHECK_EQ(test.resultD, outputs_D[i]);
2460
2461 if (i != 0) {
2462 f1 = test.resultS1 - 1.0F/outputs_S[i];
2463 f1 = (f1 < 0) ? f1 : -f1;
2464 CHECK(f1 <= deltaFloat);
2465 d1 = test.resultD1 - 1.0L/outputs_D[i];
2466 d1 = (d1 < 0) ? d1 : -d1;
2467 CHECK(d1 <= deltaDouble);
2468 f1 = test.resultS2 - 1.0F/inputs_S[i];
2469 f1 = (f1 < 0) ? f1 : -f1;
2470 CHECK(f1 <= deltaFloat);
2471 d1 = test.resultD2 - 1.0L/inputs_D[i];
2472 d1 = (d1 < 0) ? d1 : -d1;
2473 CHECK(d1 <= deltaDouble);
2474 } else {
2475 CHECK_EQ(test.resultS1, 1.0F/outputs_S[i]);
2476 CHECK_EQ(test.resultD1, 1.0L/outputs_D[i]);
2477 CHECK_EQ(test.resultS2, 1.0F/inputs_S[i]);
2478 CHECK_EQ(test.resultD2, 1.0L/inputs_D[i]);
2479 }
2480 }
2481 }
2482
2483
2484 TEST(MIPS29) {
2485 const int tableLength = 2;
2486 CcTest::InitializeVM();
2487 Isolate* isolate = CcTest::i_isolate();
2488 HandleScope scope(isolate);
2489 MacroAssembler assm(isolate, NULL, 0);
2490
2491 typedef struct test_float {
2492 float a;
2493 float resultS;
2494 double c;
2495 double resultD;
2496 }TestFloat;
2497
2498 TestFloat test;
2499 double inputs_D[tableLength] = {
2500 4.0, -2.0
2501 };
2502
2503 double outputs_D[tableLength] = {
2504 -4.0, 2.0
2505 };
2506 float inputs_S[tableLength] = {
2507 4.0, -2.0
2508 };
2509
2510 float outputs_S[tableLength] = {
2511 -4.0, 2.0
2512 };
2513 __ lwc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2514 __ ldc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, c)) );
2515 __ neg_s(f6, f2);
2516 __ neg_d(f12, f8);
2517 __ swc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, resultS)) );
2518 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, resultD)) );
2519 __ jr(ra);
2520 __ nop();
2521
2522 CodeDesc desc;
2523 assm.GetCode(&desc);
2524 Handle<Code> code = isolate->factory()->NewCode(
2525 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2526 F3 f = FUNCTION_CAST<F3>(code->entry());
2527 for (int i = 0; i < tableLength; i++) {
2528 test.a = inputs_S[i];
2529 test.c = inputs_D[i];
2530 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2531 CHECK_EQ(test.resultS, outputs_S[i]);
2532 CHECK_EQ(test.resultD, outputs_D[i]);
2533 }
2534 }
2535
2536
2537
2538 TEST(MIPS30) {
2539 const int tableLength = 4;
2540 CcTest::InitializeVM();
2541 Isolate* isolate = CcTest::i_isolate();
2542 HandleScope scope(isolate);
2543 MacroAssembler assm(isolate, NULL, 0);
2544
2545 typedef struct test_float {
2546 float a;
2547 float b;
2548 float resultS;
2549 double c;
2550 double d;
2551 double resultD;
2552 }TestFloat;
2553
2554 TestFloat test;
2555 double inputfs_D[tableLength] = {
2556 5.3, -5.3, 5.3, -2.9
2557 };
2558 double inputft_D[tableLength] = {
2559 4.8, 4.8, -4.8, -0.29
2560 };
2561
2562 float inputfs_S[tableLength] = {
2563 5.3, -5.3, 5.3, -2.9
2564 };
2565 float inputft_S[tableLength] = {
2566 4.8, 4.8, -4.8, -0.29
2567 };
2568
2569 __ lwc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2570 __ lwc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
2571 __ ldc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, c)) );
2572 __ ldc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, d)) );
2573 __ mul_s(f10, f2, f4);
2574 __ mul_d(f12, f6, f8);
2575 __ swc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, resultS)) );
2576 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, resultD)) );
2577 __ jr(ra);
2578 __ nop();
2579
2580 CodeDesc desc;
2581 assm.GetCode(&desc);
2582 Handle<Code> code = isolate->factory()->NewCode(
2583 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2584 F3 f = FUNCTION_CAST<F3>(code->entry());
2585 for (int i = 0; i < tableLength; i++) {
2586 test.a = inputfs_S[i];
2587 test.b = inputft_S[i];
2588 test.c = inputfs_D[i];
2589 test.d = inputft_D[i];
2590 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2591 CHECK_EQ(test.resultS, inputfs_S[i]*inputft_S[i]);
2592 CHECK_EQ(test.resultD, inputfs_D[i]*inputft_D[i]);
2593 }
2594 }
2595
2596
2597 TEST(MIPS31) {
2598 if (kArchVariant == kMips64r2) {
2599 const int tableLength = 4;
2600 CcTest::InitializeVM();
2601 Isolate* isolate = CcTest::i_isolate();
2602 HandleScope scope(isolate);
2603 MacroAssembler assm(isolate, NULL, 0);
2604
2605 typedef struct test_float {
2606 int64_t rt;
2607 double a;
2608 double b;
2609 double bold;
2610 double b1;
2611 double bold1;
2612 float c;
2613 float d;
2614 float dold;
2615 float d1;
2616 float dold1;
2617 }TestFloat;
2618
2619 TestFloat test;
2620 double inputs_D[tableLength] = {
2621 5.3, -5.3, 5.3, -2.9
2622 };
2623 double inputs_S[tableLength] = {
2624 4.8, 4.8, -4.8, -0.29
2625 };
2626
2627 float outputs_S[tableLength] = {
2628 4.8, 4.8, -4.8, -0.29
2629 };
2630 double outputs_D[tableLength] = {
2631 5.3, -5.3, 5.3, -2.9
2632 };
2633
2634 __ ldc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2635 __ lwc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, c)) );
2636 __ lw(t0, MemOperand(a0, OFFSET_OF(TestFloat, rt)) );
2637 __ li(t1, 0x0);
2638 __ mtc1(t1, f12);
2639 __ mtc1(t1, f10);
2640 __ mtc1(t1, f16);
2641 __ mtc1(t1, f14);
2642 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, bold)) );
2643 __ swc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, dold)) );
2644 __ sdc1(f16, MemOperand(a0, OFFSET_OF(TestFloat, bold1)) );
2645 __ swc1(f14, MemOperand(a0, OFFSET_OF(TestFloat, dold1)) );
2646 __ movz_s(f10, f6, t0);
2647 __ movz_d(f12, f2, t0);
2648 __ movn_s(f14, f6, t0);
2649 __ movn_d(f16, f2, t0);
2650 __ swc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, d)) );
2651 __ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
2652 __ swc1(f14, MemOperand(a0, OFFSET_OF(TestFloat, d1)) );
2653 __ sdc1(f16, MemOperand(a0, OFFSET_OF(TestFloat, b1)) );
2654 __ jr(ra);
2655 __ nop();
2656
2657 CodeDesc desc;
2658 assm.GetCode(&desc);
2659 Handle<Code> code = isolate->factory()->NewCode(
2660 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2661 F3 f = FUNCTION_CAST<F3>(code->entry());
2662 for (int i = 0; i < tableLength; i++) {
2663 test.a = inputs_D[i];
2664 test.c = inputs_S[i];
2665
2666 test.rt = 1;
2667 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2668 CHECK_EQ(test.b, test.bold);
2669 CHECK_EQ(test.d, test.dold);
2670 CHECK_EQ(test.b1, outputs_D[i]);
2671 CHECK_EQ(test.d1, outputs_S[i]);
2672
2673 test.rt = 0;
2674 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2675 CHECK_EQ(test.b, outputs_D[i]);
2676 CHECK_EQ(test.d, outputs_S[i]);
2677 CHECK_EQ(test.b1, test.bold1);
2678 CHECK_EQ(test.d1, test.dold1);
2679 }
2680 }
2681 }
2682
2683
2684 TEST(MIPS32) {
2685 if (kArchVariant == kMips64r2) {
2686 const int tableLength = 4;
2687 CcTest::InitializeVM();
2688 Isolate* isolate = CcTest::i_isolate();
2689 // HandleScope scope(isolate);HandleScope scope(isolate);
2690 // MacroAssembler assm(isolate, NULL, 0);
2691
2692 typedef struct test_float {
2693 double srcd;
2694 double dstd;
2695 double dstdold;
2696 double dstd1;
2697 double dstdold1;
2698 float srcf;
2699 float dstf;
2700 float dstfold;
2701 float dstf1;
2702 float dstfold1;
2703 int32_t cc;
2704 int32_t fcsr;
2705 }TestFloat;
2706
2707 TestFloat test;
2708 double inputs_D[tableLength] = {
2709 5.3, -5.3, 20.8, -2.9
2710 };
2711 double inputs_S[tableLength] = {
2712 4.88, 4.8, -4.8, -0.29
2713 };
2714
2715 float outputs_S[tableLength] = {
2716 4.88, 4.8, -4.8, -0.29
2717 };
2718 double outputs_D[tableLength] = {
2719 5.3, -5.3, 20.8, -2.9
2720 };
2721 int condition_flags[8] = {0, 1, 2, 3, 4, 5, 6, 7};
2722
2723 for (int i = 0; i < tableLength; i++) {
2724 test.srcd = inputs_D[i];
2725 test.srcf = inputs_S[i];
2726
2727 for (int j = 0; j< 8; j++) {
2728 test.cc = condition_flags[j];
2729 if (test.cc == 0) {
2730 test.fcsr = 1 << 23;
2731 } else {
2732 test.fcsr = 1 << (24+condition_flags[j]);
2733 }
2734 HandleScope scope(isolate);
2735 MacroAssembler assm(isolate, NULL, 0);
2736 __ ldc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, srcd)) );
2737 __ lwc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, srcf)) );
2738 __ lw(t1, MemOperand(a0, OFFSET_OF(TestFloat, fcsr)) );
2739 __ cfc1(t0, FCSR);
2740 __ ctc1(t1, FCSR);
2741 __ li(t2, 0x0);
2742 __ mtc1(t2, f12);
2743 __ mtc1(t2, f10);
2744 __ sdc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, dstdold)) );
2745 __ swc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, dstfold)) );
2746 __ movt_s(f12, f4, test.cc);
2747 __ movt_d(f10, f2, test.cc);
2748 __ swc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, dstf)) );
2749 __ sdc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, dstd)) );
2750 __ sdc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, dstdold1)) );
2751 __ swc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, dstfold1)) );
2752 __ movf_s(f12, f4, test.cc);
2753 __ movf_d(f10, f2, test.cc);
2754 __ swc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, dstf1)) );
2755 __ sdc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, dstd1)) );
2756 __ ctc1(t0, FCSR);
2757 __ jr(ra);
2758 __ nop();
2759
2760 CodeDesc desc;
2761 assm.GetCode(&desc);
2762 Handle<Code> code = isolate->factory()->NewCode(
2763 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2764 F3 f = FUNCTION_CAST<F3>(code->entry());
2765
2766 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2767 CHECK_EQ(test.dstf, outputs_S[i]);
2768 CHECK_EQ(test.dstd, outputs_D[i]);
2769 CHECK_EQ(test.dstf1, test.dstfold1);
2770 CHECK_EQ(test.dstd1, test.dstdold1);
2771 test.fcsr = 0;
2772 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2773 CHECK_EQ(test.dstf, test.dstfold);
2774 CHECK_EQ(test.dstd, test.dstdold);
2775 CHECK_EQ(test.dstf1, outputs_S[i]);
2776 CHECK_EQ(test.dstd1, outputs_D[i]);
2777 }
2778 }
2779 }
2780 }
2781
2782
2783 TEST(MIPS33) {
2784 const int tableLength = 4;
2785 CcTest::InitializeVM();
2786 Isolate* isolate = CcTest::i_isolate();
2787 HandleScope scope(isolate);
2788 MacroAssembler assm(isolate, NULL, 0);
2789
2790 typedef struct test_float {
2791 double a;
2792 double b;
2793 float c;
2794 float d;
2795 }TestFloat;
2796
2797 TestFloat test;
2798 double inputs_D[tableLength] = {
2799 5.3, -5.3, 5.3, -2.9
2800 };
2801 double inputs_S[tableLength] = {
2802 4.8, 4.8, -4.8, -0.29
2803 };
2804
2805 float outputs_S[tableLength] = {
2806 4.8, 4.8, -4.8, -0.29
2807 };
2808 double outputs_D[tableLength] = {
2809 5.3, -5.3, 5.3, -2.9
2810 };
2811
2812 __ ldc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2813 __ lwc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, c)) );
2814 __ mov_s(f18, f6);
2815 __ mov_d(f20, f2);
2816 __ swc1(f18, MemOperand(a0, OFFSET_OF(TestFloat, d)) );
2817 __ sdc1(f20, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
2818 __ jr(ra);
2819 __ nop();
2820
2821 CodeDesc desc;
2822 assm.GetCode(&desc);
2823 Handle<Code> code = isolate->factory()->NewCode(
2824 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2825 F3 f = FUNCTION_CAST<F3>(code->entry());
2826 for (int i = 0; i < tableLength; i++) {
2827 test.a = inputs_D[i];
2828 test.c = inputs_S[i];
2829
2830 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2831 CHECK_EQ(test.b, outputs_D[i]);
2832 CHECK_EQ(test.d, outputs_S[i]);
2833 }
2834 }
2835
2836
2837 TEST(MIPS34) {
2838 if (kArchVariant == kMips64r6) {
2839 const int tableLength = 12;
2840 CcTest::InitializeVM();
2841 Isolate* isolate = CcTest::i_isolate();
2842 HandleScope scope(isolate);
2843 MacroAssembler assm(isolate, NULL, 0);
2844
2845 typedef struct test_float {
2846 double a;
2847 double b;
2848 double resd;
2849 double resd1;
2850 float c;
2851 float d;
2852 float resf;
2853 float resf1;
2854 }TestFloat;
2855
2856 TestFloat test;
2857 double inputsa[tableLength] = {
2858 5.3, 4.8, 6.1,
2859 9.8, 9.8, 9.8,
2860 -10.0, -8.9, -9.8,
2861 -10.0, -8.9, -9.8
2862 };
2863 double inputsb[tableLength] = {
2864 4.8, 5.3, 6.1,
2865 -10.0, -8.9, -9.8,
2866 9.8, 9.8, 9.8,
2867 -9.8, -11.2, -9.8
2868 };
2869 double resd[tableLength] = {
2870 4.8, 4.8, 6.1,
2871 9.8, -8.9, 9.8,
2872 9.8, -8.9, 9.8,
2873 -9.8, -8.9, -9.8
2874 };
2875 double resd1[tableLength] = {
2876 5.3, 5.3, 6.1,
2877 -10.0, 9.8, 9.8,
2878 -10.0, 9.8, 9.8,
2879 -10.0, -11.2, -9.8
2880 };
2881 float inputsc[tableLength] = {
2882 5.3, 4.8, 6.1,
2883 9.8, 9.8, 9.8,
2884 -10.0, -8.9, -9.8,
2885 -10.0, -8.9, -9.8
2886 };
2887 float inputsd[tableLength] = {
2888 4.8, 5.3, 6.1,
2889 -10.0, -8.9, -9.8,
2890 9.8, 9.8, 9.8,
2891 -9.8, -11.2, -9.8
2892 };
2893 float resf[tableLength] = {
2894 4.8, 4.8, 6.1,
2895 9.8, -8.9, 9.8,
2896 9.8, -8.9, 9.8,
2897 -9.8, -8.9, -9.8
2898 };
2899 float resf1[tableLength] = {
2900 5.3, 5.3, 6.1,
2901 -10.0, 9.8, 9.8,
2902 -10.0, 9.8, 9.8,
2903 -10.0, -11.2, -9.8
2904 };
2905
2906 __ ldc1(f2, MemOperand(a0, OFFSET_OF(TestFloat, a)) );
2907 __ ldc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, b)) );
2908 __ lwc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, c)) );
2909 __ lwc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, d)) );
2910 __ mina_d(f6, f2, f4);
2911 __ mina_s(f12, f8, f10);
2912 __ maxa_d(f14, f2, f4);
2913 __ maxa_s(f16, f8, f10);
2914 __ swc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, resf)) );
2915 __ sdc1(f6, MemOperand(a0, OFFSET_OF(TestFloat, resd)) );
2916 __ swc1(f16, MemOperand(a0, OFFSET_OF(TestFloat, resf1)) );
2917 __ sdc1(f14, MemOperand(a0, OFFSET_OF(TestFloat, resd1)) );
2918 __ jr(ra);
2919 __ nop();
2920
2921 CodeDesc desc;
2922 assm.GetCode(&desc);
2923 Handle<Code> code = isolate->factory()->NewCode(
2924 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2925 F3 f = FUNCTION_CAST<F3>(code->entry());
2926 for (int i = 0; i < tableLength; i++) {
2927 test.a = inputsa[i];
2928 test.b = inputsb[i];
2929 test.c = inputsc[i];
2930 test.d = inputsd[i];
2931 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2932
2933 CHECK_EQ(test.resd, resd[i]);
2934 CHECK_EQ(test.resf, resf[i]);
2935 CHECK_EQ(test.resd1, resd1[i]);
2936 CHECK_EQ(test.resf1, resf1[i]);
2937 }
2938 }
2939 }
2940
2941
2942 TEST(MIPS35) {
2943 CcTest::InitializeVM();
2944 Isolate* isolate = CcTest::i_isolate();
2945 HandleScope scope(isolate);
2946 MacroAssembler assm(isolate, NULL, 0);
2947
2948 typedef struct test_float {
2949 double a;
2950 float b;
2951 int32_t c; // a floor result
2952 int32_t d; // b floor result
2953 }Test;
2954 const int tableLength = 15;
2955 double inputs_D[tableLength] = {
2956 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
2957 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
2958 2147483648.0,
2959 std::numeric_limits<double>::quiet_NaN(),
2960 std::numeric_limits<double>::infinity()
2961 };
2962 float inputs_S[tableLength] = {
2963 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
2964 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
2965 2147483648.0,
2966 std::numeric_limits<float>::quiet_NaN(),
2967 std::numeric_limits<float>::infinity()
2968 };
2969 double outputs[tableLength] = {
2970 2.0, 2.0, 2.0, 3.0, 3.0, 3.0,
2971 -3.0, -3.0, -3.0, -4.0, -4.0, -4.0,
2972 kFPUInvalidResult, kFPUInvalidResult,
2973 kFPUInvalidResult};
2974
2975 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
2976 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
2977 __ floor_w_d(f8, f4);
2978 __ floor_w_s(f10, f6);
2979 __ swc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
2980 __ swc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
2981 __ jr(ra);
2982 __ nop();
2983 Test test;
2984 CodeDesc desc;
2985 assm.GetCode(&desc);
2986 Handle<Code> code = isolate->factory()->NewCode(
2987 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
2988 F3 f = FUNCTION_CAST<F3>(code->entry());
2989 for (int i = 0; i < tableLength; i++) {
2990 test.a = inputs_D[i];
2991 test.b = inputs_S[i];
2992 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
2993 CHECK_EQ(test.c, outputs[i]);
2994 CHECK_EQ(test.d, test.c);
2995 }
2996 }
2997
2998
2999 TEST(MIPS36) {
3000 CcTest::InitializeVM();
3001 Isolate* isolate = CcTest::i_isolate();
3002 HandleScope scope(isolate);
3003 MacroAssembler assm(isolate, NULL, 0);
3004 const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult);
3005 typedef struct test_float {
3006 double a;
3007 float b;
3008 int64_t c;
3009 int64_t d;
3010 }Test;
3011 const int tableLength = 16;
3012 double inputs_D[tableLength] = {
3013 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
3014 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
3015 2147483648.0,
3016 std::numeric_limits<double>::quiet_NaN(),
3017 std::numeric_limits<double>::infinity(),
3018 9223372036854775808.0
3019 };
3020 float inputs_S[tableLength] = {
3021 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
3022 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
3023 2147483648.0,
3024 std::numeric_limits<float>::quiet_NaN(),
3025 std::numeric_limits<float>::infinity(),
3026 9223372036854775808.0
3027 };
3028 double outputs[tableLength] = {
3029 2.0, 2.0, 2.0, 3.0, 3.0, 3.0,
3030 -3.0, -3.0, -3.0, -4.0, -4.0, -4.0,
3031 2147483648.0, dFPU64InvalidResult,
3032 dFPU64InvalidResult, dFPU64InvalidResult};
3033
3034 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
3035 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
3036 __ floor_l_d(f8, f4);
3037 __ floor_l_s(f10, f6);
3038 __ sdc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
3039 __ sdc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
3040 __ jr(ra);
3041 __ nop();
3042 Test test;
3043 CodeDesc desc;
3044 assm.GetCode(&desc);
3045 Handle<Code> code = isolate->factory()->NewCode(
3046 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
3047 F3 f = FUNCTION_CAST<F3>(code->entry());
3048 for (int i = 0; i < tableLength; i++) {
3049 test.a = inputs_D[i];
3050 test.b = inputs_S[i];
3051 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
3052 CHECK_EQ(test.c, outputs[i]);
3053 CHECK_EQ(test.d, test.c);
3054 }
3055 }
3056
3057
3058 TEST(MIPS37) {
3059 CcTest::InitializeVM();
3060 Isolate* isolate = CcTest::i_isolate();
3061 HandleScope scope(isolate);
3062 MacroAssembler assm(isolate, NULL, 0);
3063
3064 typedef struct test_float {
3065 double a;
3066 float b;
3067 int32_t c; // a floor result
3068 int32_t d; // b floor result
3069 }Test;
3070 const int tableLength = 15;
3071 double inputs_D[tableLength] = {
3072 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
3073 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
3074 2147483648.0,
3075 std::numeric_limits<double>::quiet_NaN(),
3076 std::numeric_limits<double>::infinity()
3077 };
3078 float inputs_S[tableLength] = {
3079 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
3080 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
3081 2147483648.0,
3082 std::numeric_limits<float>::quiet_NaN(),
3083 std::numeric_limits<float>::infinity()
3084 };
3085 double outputs[tableLength] = {
3086 3.0, 3.0, 3.0, 4.0, 4.0, 4.0,
3087 -2.0, -2.0, -2.0, -3.0, -3.0, -3.0,
3088 kFPUInvalidResult, kFPUInvalidResult,
3089 kFPUInvalidResult};
3090
3091 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
3092 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
3093 __ ceil_w_d(f8, f4);
3094 __ ceil_w_s(f10, f6);
3095 __ swc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
3096 __ swc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
3097 __ jr(ra);
3098 __ nop();
3099 Test test;
3100 CodeDesc desc;
3101 assm.GetCode(&desc);
3102 Handle<Code> code = isolate->factory()->NewCode(
3103 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
3104 F3 f = FUNCTION_CAST<F3>(code->entry());
3105 for (int i = 0; i < tableLength; i++) {
3106 test.a = inputs_D[i];
3107 test.b = inputs_S[i];
3108 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
3109 CHECK_EQ(test.c, outputs[i]);
3110 CHECK_EQ(test.d, test.c);
3111 }
3112 }
3113
3114
3115 TEST(MIPS38) {
3116 CcTest::InitializeVM();
3117 Isolate* isolate = CcTest::i_isolate();
3118 HandleScope scope(isolate);
3119 MacroAssembler assm(isolate, NULL, 0);
3120 const double dFPU64InvalidResult = static_cast<double>(kFPU64InvalidResult);
3121 typedef struct test_float {
3122 double a;
3123 float b;
3124 int64_t c;
3125 int64_t d;
3126 }Test;
3127 const int tableLength = 16;
3128 double inputs_D[tableLength] = {
3129 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
3130 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
3131 2147483648.0,
3132 std::numeric_limits<double>::quiet_NaN(),
3133 std::numeric_limits<double>::infinity(),
3134 9223372036854775808.0
3135 };
3136 float inputs_S[tableLength] = {
3137 2.1, 2.6, 2.5, 3.1, 3.6, 3.5,
3138 -2.1, -2.6, -2.5, -3.1, -3.6, -3.5,
3139 2147483648.0,
3140 std::numeric_limits<float>::quiet_NaN(),
3141 std::numeric_limits<float>::infinity(),
3142 9223372036854775808.0
3143 };
3144 double outputs[tableLength] = {
3145 3.0, 3.0, 3.0, 4.0, 4.0, 4.0,
3146 -2.0, -2.0, -2.0, -3.0, -3.0, -3.0,
3147 2147483648.0, dFPU64InvalidResult,
3148 dFPU64InvalidResult, dFPU64InvalidResult};
3149
3150 __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) );
3151 __ lwc1(f6, MemOperand(a0, OFFSET_OF(Test, b)) );
3152 __ ceil_l_d(f8, f4);
3153 __ ceil_l_s(f10, f6);
3154 __ sdc1(f8, MemOperand(a0, OFFSET_OF(Test, c)) );
3155 __ sdc1(f10, MemOperand(a0, OFFSET_OF(Test, d)) );
3156 __ jr(ra);
3157 __ nop();
3158 Test test;
3159 CodeDesc desc;
3160 assm.GetCode(&desc);
3161 Handle<Code> code = isolate->factory()->NewCode(
3162 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
3163 F3 f = FUNCTION_CAST<F3>(code->entry());
3164 for (int i = 0; i < tableLength; i++) {
3165 test.a = inputs_D[i];
3166 test.b = inputs_S[i];
3167 (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0));
3168 CHECK_EQ(test.c, outputs[i]);
3169 CHECK_EQ(test.d, test.c);
3170 }
3171 }
1870 3172
1871 3173
1872 TEST(jump_tables1) { 3174 TEST(jump_tables1) {
1873 // Test jump tables with forward jumps. 3175 // Test jump tables with forward jumps.
1874 CcTest::InitializeVM(); 3176 CcTest::InitializeVM();
1875 Isolate* isolate = CcTest::i_isolate(); 3177 Isolate* isolate = CcTest::i_isolate();
1876 HandleScope scope(isolate); 3178 HandleScope scope(isolate);
1877 Assembler assm(isolate, nullptr, 0); 3179 Assembler assm(isolate, nullptr, 0);
1878 3180
1879 const int kNumCases = 512; 3181 const int kNumCases = 512;
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
2086 ::printf("f(%d) = ", i); 3388 ::printf("f(%d) = ", i);
2087 result->Print(std::cout); 3389 result->Print(std::cout);
2088 ::printf("\n"); 3390 ::printf("\n");
2089 #endif 3391 #endif
2090 CHECK(values[i].is_identical_to(result)); 3392 CHECK(values[i].is_identical_to(result));
2091 } 3393 }
2092 } 3394 }
2093 3395
2094 3396
2095 #undef __ 3397 #undef __
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698