authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-05-03 15:51:11+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-03 17:12:33-04:00
log2f3b46170340cfe20be4539c4d1eeea9a1dd9cb2
treecf3394a1c851756ebe1330f208c6536482792a20
parent1be4e87f0bfffa07bc150ff8057aef3a9e85144c

compiler-rt: Add __modsi3, __umodsi3


1 files changed, 185 insertions(+), 0 deletions(-)

std/special/compiler_rt.zig+185
......@@ -106,7 +106,9 @@ comptime {
106106 @export("__divdi3", __divdi3, linkage);
107107 @export("__udivsi3", __udivsi3, linkage);
108108 @export("__udivdi3", __udivdi3, linkage);
109 @export("__modsi3", __modsi3, linkage);
109110 @export("__moddi3", __moddi3, linkage);
111 @export("__umodsi3", __umodsi3, linkage);
110112 @export("__umoddi3", __umoddi3, linkage);
111113 @export("__divmodsi4", __divmodsi4, linkage);
112114 @export("__udivmodsi4", __udivmodsi4, linkage);
......@@ -664,6 +666,18 @@ extern fn __udivsi3(n: u32, d: u32) u32 {
664666 return q;
665667}
666668
669extern fn __modsi3(n: i32, d: i32) i32 {
670 @setRuntimeSafety(is_test);
671
672 return n -% __divsi3(n, d) *% d;
673}
674
675extern fn __umodsi3(n: u32, d: u32) u32 {
676 @setRuntimeSafety(is_test);
677
678 return n -% __udivsi3(n, d) *% d;
679}
680
667681test "test_umoddi3" {
668682 test_one_umoddi3(0, 1, 0);
669683 test_one_umoddi3(2, 1, 0);
......@@ -1455,3 +1469,174 @@ fn test_one_moddi3(a: i64, b: i64, expected_r: i64) void {
14551469 const r: i64 = __moddi3(a, b);
14561470 testing.expect(r == expected_r);
14571471}
1472
1473test "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
1493fn 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
1498test "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
1639fn 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}