| ... | ... | @@ -106,7 +106,9 @@ comptime { |
| 106 | 106 | @export("__divdi3", __divdi3, linkage); |
| 107 | 107 | @export("__udivsi3", __udivsi3, linkage); |
| 108 | 108 | @export("__udivdi3", __udivdi3, linkage); |
| 109 | @export("__modsi3", __modsi3, linkage); |
| 109 | 110 | @export("__moddi3", __moddi3, linkage); |
| 111 | @export("__umodsi3", __umodsi3, linkage); |
| 110 | 112 | @export("__umoddi3", __umoddi3, linkage); |
| 111 | 113 | @export("__divmodsi4", __divmodsi4, linkage); |
| 112 | 114 | @export("__udivmodsi4", __udivmodsi4, linkage); |
| ... | ... | @@ -664,6 +666,18 @@ extern fn __udivsi3(n: u32, d: u32) u32 { |
| 664 | 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 | 681 | test "test_umoddi3" { |
| 668 | 682 | test_one_umoddi3(0, 1, 0); |
| 669 | 683 | test_one_umoddi3(2, 1, 0); |
| ... | ... | @@ -1455,3 +1469,174 @@ fn test_one_moddi3(a: i64, b: i64, expected_r: i64) void { |
| 1455 | 1469 | const r: i64 = __moddi3(a, b); |
| 1456 | 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 | } |