| ... | @@ -106,7 +106,9 @@ comptime { | ... | @@ -106,7 +106,9 @@ comptime { |
| 106 | @export("__divdi3", __divdi3, linkage); | 106 | @export("__divdi3", __divdi3, linkage); |
| 107 | @export("__udivsi3", __udivsi3, linkage); | 107 | @export("__udivsi3", __udivsi3, linkage); |
| 108 | @export("__udivdi3", __udivdi3, linkage); | 108 | @export("__udivdi3", __udivdi3, linkage); |
| | 109 | @export("__modsi3", __modsi3, linkage); |
| 109 | @export("__moddi3", __moddi3, linkage); | 110 | @export("__moddi3", __moddi3, linkage); |
| | 111 | @export("__umodsi3", __umodsi3, linkage); |
| 110 | @export("__umoddi3", __umoddi3, linkage); | 112 | @export("__umoddi3", __umoddi3, linkage); |
| 111 | @export("__divmodsi4", __divmodsi4, linkage); | 113 | @export("__divmodsi4", __divmodsi4, linkage); |
| 112 | @export("__udivmodsi4", __udivmodsi4, linkage); | 114 | @export("__udivmodsi4", __udivmodsi4, linkage); |
| ... | @@ -664,6 +666,18 @@ extern fn __udivsi3(n: u32, d: u32) u32 { | ... | @@ -664,6 +666,18 @@ extern fn __udivsi3(n: u32, d: u32) u32 { |
| 664 | return q; | 666 | return q; |
| 665 | } | 667 | } |
| 666 | | 668 | |
| | 669 | extern fn __modsi3(n: i32, d: i32) i32 { |
| | 670 | @setRuntimeSafety(is_test); |
| | 671 | |
| | 672 | return n -% __divsi3(n, d) *% d; |
| | 673 | } |
| | 674 | |
| | 675 | extern fn __umodsi3(n: u32, d: u32) u32 { |
| | 676 | @setRuntimeSafety(is_test); |
| | 677 | |
| | 678 | return n -% __udivsi3(n, d) *% d; |
| | 679 | } |
| | 680 | |
| 667 | test "test_umoddi3" { | 681 | test "test_umoddi3" { |
| 668 | test_one_umoddi3(0, 1, 0); | 682 | test_one_umoddi3(0, 1, 0); |
| 669 | test_one_umoddi3(2, 1, 0); | 683 | test_one_umoddi3(2, 1, 0); |
| ... | @@ -1455,3 +1469,174 @@ fn test_one_moddi3(a: i64, b: i64, expected_r: i64) void { | ... | @@ -1455,3 +1469,174 @@ fn test_one_moddi3(a: i64, b: i64, expected_r: i64) void { |
| 1455 | const r: i64 = __moddi3(a, b); | 1469 | const r: i64 = __moddi3(a, b); |
| 1456 | testing.expect(r == expected_r); | 1470 | testing.expect(r == expected_r); |
| 1457 | } | 1471 | } |
| | 1472 | |
| | 1473 | test "test_modsi3" { |
| | 1474 | const cases = [][3]i32{ |
| | 1475 | []i32{0, 1, 0}, |
| | 1476 | []i32{0, -1, 0}, |
| | 1477 | []i32{5, 3, 2}, |
| | 1478 | []i32{5, -3, 2}, |
| | 1479 | []i32{-5, 3, -2}, |
| | 1480 | []i32{-5, -3, -2}, |
| | 1481 | []i32{@bitCast(i32, @intCast(u32, 0x80000000)), 1, 0x0}, |
| | 1482 | []i32{@bitCast(i32, @intCast(u32, 0x80000000)), 2, 0x0}, |
| | 1483 | []i32{@bitCast(i32, @intCast(u32, 0x80000000)), -2, 0x0}, |
| | 1484 | []i32{@bitCast(i32, @intCast(u32, 0x80000000)), 3, -2}, |
| | 1485 | []i32{@bitCast(i32, @intCast(u32, 0x80000000)), -3, -2}, |
| | 1486 | }; |
| | 1487 | |
| | 1488 | for (cases) |case| { |
| | 1489 | test_one_modsi3(case[0], case[1], case[2]); |
| | 1490 | } |
| | 1491 | } |
| | 1492 | |
| | 1493 | fn test_one_modsi3(a: i32, b: i32, expected_r: i32) void { |
| | 1494 | const r: i32 = __modsi3(a, b); |
| | 1495 | testing.expect(r == expected_r); |
| | 1496 | } |
| | 1497 | |
| | 1498 | test "test_umodsi3" { |
| | 1499 | const cases = [][3]u32{ |
| | 1500 | []u32{0x00000000, 0x00000001, 0x00000000}, |
| | 1501 | []u32{0x00000000, 0x00000002, 0x00000000}, |
| | 1502 | []u32{0x00000000, 0x00000003, 0x00000000}, |
| | 1503 | []u32{0x00000000, 0x00000010, 0x00000000}, |
| | 1504 | []u32{0x00000000, 0x078644FA, 0x00000000}, |
| | 1505 | []u32{0x00000000, 0x0747AE14, 0x00000000}, |
| | 1506 | []u32{0x00000000, 0x7FFFFFFF, 0x00000000}, |
| | 1507 | []u32{0x00000000, 0x80000000, 0x00000000}, |
| | 1508 | []u32{0x00000000, 0xFFFFFFFD, 0x00000000}, |
| | 1509 | []u32{0x00000000, 0xFFFFFFFE, 0x00000000}, |
| | 1510 | []u32{0x00000000, 0xFFFFFFFF, 0x00000000}, |
| | 1511 | []u32{0x00000001, 0x00000001, 0x00000000}, |
| | 1512 | []u32{0x00000001, 0x00000002, 0x00000001}, |
| | 1513 | []u32{0x00000001, 0x00000003, 0x00000001}, |
| | 1514 | []u32{0x00000001, 0x00000010, 0x00000001}, |
| | 1515 | []u32{0x00000001, 0x078644FA, 0x00000001}, |
| | 1516 | []u32{0x00000001, 0x0747AE14, 0x00000001}, |
| | 1517 | []u32{0x00000001, 0x7FFFFFFF, 0x00000001}, |
| | 1518 | []u32{0x00000001, 0x80000000, 0x00000001}, |
| | 1519 | []u32{0x00000001, 0xFFFFFFFD, 0x00000001}, |
| | 1520 | []u32{0x00000001, 0xFFFFFFFE, 0x00000001}, |
| | 1521 | []u32{0x00000001, 0xFFFFFFFF, 0x00000001}, |
| | 1522 | []u32{0x00000002, 0x00000001, 0x00000000}, |
| | 1523 | []u32{0x00000002, 0x00000002, 0x00000000}, |
| | 1524 | []u32{0x00000002, 0x00000003, 0x00000002}, |
| | 1525 | []u32{0x00000002, 0x00000010, 0x00000002}, |
| | 1526 | []u32{0x00000002, 0x078644FA, 0x00000002}, |
| | 1527 | []u32{0x00000002, 0x0747AE14, 0x00000002}, |
| | 1528 | []u32{0x00000002, 0x7FFFFFFF, 0x00000002}, |
| | 1529 | []u32{0x00000002, 0x80000000, 0x00000002}, |
| | 1530 | []u32{0x00000002, 0xFFFFFFFD, 0x00000002}, |
| | 1531 | []u32{0x00000002, 0xFFFFFFFE, 0x00000002}, |
| | 1532 | []u32{0x00000002, 0xFFFFFFFF, 0x00000002}, |
| | 1533 | []u32{0x00000003, 0x00000001, 0x00000000}, |
| | 1534 | []u32{0x00000003, 0x00000002, 0x00000001}, |
| | 1535 | []u32{0x00000003, 0x00000003, 0x00000000}, |
| | 1536 | []u32{0x00000003, 0x00000010, 0x00000003}, |
| | 1537 | []u32{0x00000003, 0x078644FA, 0x00000003}, |
| | 1538 | []u32{0x00000003, 0x0747AE14, 0x00000003}, |
| | 1539 | []u32{0x00000003, 0x7FFFFFFF, 0x00000003}, |
| | 1540 | []u32{0x00000003, 0x80000000, 0x00000003}, |
| | 1541 | []u32{0x00000003, 0xFFFFFFFD, 0x00000003}, |
| | 1542 | []u32{0x00000003, 0xFFFFFFFE, 0x00000003}, |
| | 1543 | []u32{0x00000003, 0xFFFFFFFF, 0x00000003}, |
| | 1544 | []u32{0x00000010, 0x00000001, 0x00000000}, |
| | 1545 | []u32{0x00000010, 0x00000002, 0x00000000}, |
| | 1546 | []u32{0x00000010, 0x00000003, 0x00000001}, |
| | 1547 | []u32{0x00000010, 0x00000010, 0x00000000}, |
| | 1548 | []u32{0x00000010, 0x078644FA, 0x00000010}, |
| | 1549 | []u32{0x00000010, 0x0747AE14, 0x00000010}, |
| | 1550 | []u32{0x00000010, 0x7FFFFFFF, 0x00000010}, |
| | 1551 | []u32{0x00000010, 0x80000000, 0x00000010}, |
| | 1552 | []u32{0x00000010, 0xFFFFFFFD, 0x00000010}, |
| | 1553 | []u32{0x00000010, 0xFFFFFFFE, 0x00000010}, |
| | 1554 | []u32{0x00000010, 0xFFFFFFFF, 0x00000010}, |
| | 1555 | []u32{0x078644FA, 0x00000001, 0x00000000}, |
| | 1556 | []u32{0x078644FA, 0x00000002, 0x00000000}, |
| | 1557 | []u32{0x078644FA, 0x00000003, 0x00000000}, |
| | 1558 | []u32{0x078644FA, 0x00000010, 0x0000000A}, |
| | 1559 | []u32{0x078644FA, 0x078644FA, 0x00000000}, |
| | 1560 | []u32{0x078644FA, 0x0747AE14, 0x003E96E6}, |
| | 1561 | []u32{0x078644FA, 0x7FFFFFFF, 0x078644FA}, |
| | 1562 | []u32{0x078644FA, 0x80000000, 0x078644FA}, |
| | 1563 | []u32{0x078644FA, 0xFFFFFFFD, 0x078644FA}, |
| | 1564 | []u32{0x078644FA, 0xFFFFFFFE, 0x078644FA}, |
| | 1565 | []u32{0x078644FA, 0xFFFFFFFF, 0x078644FA}, |
| | 1566 | []u32{0x0747AE14, 0x00000001, 0x00000000}, |
| | 1567 | []u32{0x0747AE14, 0x00000002, 0x00000000}, |
| | 1568 | []u32{0x0747AE14, 0x00000003, 0x00000002}, |
| | 1569 | []u32{0x0747AE14, 0x00000010, 0x00000004}, |
| | 1570 | []u32{0x0747AE14, 0x078644FA, 0x0747AE14}, |
| | 1571 | []u32{0x0747AE14, 0x0747AE14, 0x00000000}, |
| | 1572 | []u32{0x0747AE14, 0x7FFFFFFF, 0x0747AE14}, |
| | 1573 | []u32{0x0747AE14, 0x80000000, 0x0747AE14}, |
| | 1574 | []u32{0x0747AE14, 0xFFFFFFFD, 0x0747AE14}, |
| | 1575 | []u32{0x0747AE14, 0xFFFFFFFE, 0x0747AE14}, |
| | 1576 | []u32{0x0747AE14, 0xFFFFFFFF, 0x0747AE14}, |
| | 1577 | []u32{0x7FFFFFFF, 0x00000001, 0x00000000}, |
| | 1578 | []u32{0x7FFFFFFF, 0x00000002, 0x00000001}, |
| | 1579 | []u32{0x7FFFFFFF, 0x00000003, 0x00000001}, |
| | 1580 | []u32{0x7FFFFFFF, 0x00000010, 0x0000000F}, |
| | 1581 | []u32{0x7FFFFFFF, 0x078644FA, 0x00156B65}, |
| | 1582 | []u32{0x7FFFFFFF, 0x0747AE14, 0x043D70AB}, |
| | 1583 | []u32{0x7FFFFFFF, 0x7FFFFFFF, 0x00000000}, |
| | 1584 | []u32{0x7FFFFFFF, 0x80000000, 0x7FFFFFFF}, |
| | 1585 | []u32{0x7FFFFFFF, 0xFFFFFFFD, 0x7FFFFFFF}, |
| | 1586 | []u32{0x7FFFFFFF, 0xFFFFFFFE, 0x7FFFFFFF}, |
| | 1587 | []u32{0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF}, |
| | 1588 | []u32{0x80000000, 0x00000001, 0x00000000}, |
| | 1589 | []u32{0x80000000, 0x00000002, 0x00000000}, |
| | 1590 | []u32{0x80000000, 0x00000003, 0x00000002}, |
| | 1591 | []u32{0x80000000, 0x00000010, 0x00000000}, |
| | 1592 | []u32{0x80000000, 0x078644FA, 0x00156B66}, |
| | 1593 | []u32{0x80000000, 0x0747AE14, 0x043D70AC}, |
| | 1594 | []u32{0x80000000, 0x7FFFFFFF, 0x00000001}, |
| | 1595 | []u32{0x80000000, 0x80000000, 0x00000000}, |
| | 1596 | []u32{0x80000000, 0xFFFFFFFD, 0x80000000}, |
| | 1597 | []u32{0x80000000, 0xFFFFFFFE, 0x80000000}, |
| | 1598 | []u32{0x80000000, 0xFFFFFFFF, 0x80000000}, |
| | 1599 | []u32{0xFFFFFFFD, 0x00000001, 0x00000000}, |
| | 1600 | []u32{0xFFFFFFFD, 0x00000002, 0x00000001}, |
| | 1601 | []u32{0xFFFFFFFD, 0x00000003, 0x00000001}, |
| | 1602 | []u32{0xFFFFFFFD, 0x00000010, 0x0000000D}, |
| | 1603 | []u32{0xFFFFFFFD, 0x078644FA, 0x002AD6C9}, |
| | 1604 | []u32{0xFFFFFFFD, 0x0747AE14, 0x01333341}, |
| | 1605 | []u32{0xFFFFFFFD, 0x7FFFFFFF, 0x7FFFFFFE}, |
| | 1606 | []u32{0xFFFFFFFD, 0x80000000, 0x7FFFFFFD}, |
| | 1607 | []u32{0xFFFFFFFD, 0xFFFFFFFD, 0x00000000}, |
| | 1608 | []u32{0xFFFFFFFD, 0xFFFFFFFE, 0xFFFFFFFD}, |
| | 1609 | []u32{0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFD}, |
| | 1610 | []u32{0xFFFFFFFE, 0x00000001, 0x00000000}, |
| | 1611 | []u32{0xFFFFFFFE, 0x00000002, 0x00000000}, |
| | 1612 | []u32{0xFFFFFFFE, 0x00000003, 0x00000002}, |
| | 1613 | []u32{0xFFFFFFFE, 0x00000010, 0x0000000E}, |
| | 1614 | []u32{0xFFFFFFFE, 0x078644FA, 0x002AD6CA}, |
| | 1615 | []u32{0xFFFFFFFE, 0x0747AE14, 0x01333342}, |
| | 1616 | []u32{0xFFFFFFFE, 0x7FFFFFFF, 0x00000000}, |
| | 1617 | []u32{0xFFFFFFFE, 0x80000000, 0x7FFFFFFE}, |
| | 1618 | []u32{0xFFFFFFFE, 0xFFFFFFFD, 0x00000001}, |
| | 1619 | []u32{0xFFFFFFFE, 0xFFFFFFFE, 0x00000000}, |
| | 1620 | []u32{0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFE}, |
| | 1621 | []u32{0xFFFFFFFF, 0x00000001, 0x00000000}, |
| | 1622 | []u32{0xFFFFFFFF, 0x00000002, 0x00000001}, |
| | 1623 | []u32{0xFFFFFFFF, 0x00000003, 0x00000000}, |
| | 1624 | []u32{0xFFFFFFFF, 0x00000010, 0x0000000F}, |
| | 1625 | []u32{0xFFFFFFFF, 0x078644FA, 0x002AD6CB}, |
| | 1626 | []u32{0xFFFFFFFF, 0x0747AE14, 0x01333343}, |
| | 1627 | []u32{0xFFFFFFFF, 0x7FFFFFFF, 0x00000001}, |
| | 1628 | []u32{0xFFFFFFFF, 0x80000000, 0x7FFFFFFF}, |
| | 1629 | []u32{0xFFFFFFFF, 0xFFFFFFFD, 0x00000002}, |
| | 1630 | []u32{0xFFFFFFFF, 0xFFFFFFFE, 0x00000001}, |
| | 1631 | []u32{0xFFFFFFFF, 0xFFFFFFFF, 0x00000000} |
| | 1632 | }; |
| | 1633 | |
| | 1634 | for (cases) |case| { |
| | 1635 | test_one_umodsi3(case[0], case[1], case[2]); |
| | 1636 | } |
| | 1637 | } |
| | 1638 | |
| | 1639 | fn test_one_umodsi3(a: u32, b: u32, expected_r: u32) void { |
| | 1640 | const r: u32 = __umodsi3(a, b); |
| | 1641 | testing.expect(r == expected_r); |
| | 1642 | } |