diff options
| author | LemonBoy <thatlemon@gmail.com> | 2019-05-03 15:51:11 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-05-03 17:12:33 -0400 |
| commit | 2f3b46170340cfe20be4539c4d1eeea9a1dd9cb2 (patch) | |
| tree | cf3394a1c851756ebe1330f208c6536482792a20 /std | |
| parent | 1be4e87f0bfffa07bc150ff8057aef3a9e85144c (diff) | |
| download | zig-2f3b46170340cfe20be4539c4d1eeea9a1dd9cb2.tar.gz zig-2f3b46170340cfe20be4539c4d1eeea9a1dd9cb2.zip | |
compiler-rt: Add __modsi3, __umodsi3
Diffstat (limited to 'std')
| -rw-r--r-- | std/special/compiler_rt.zig | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/std/special/compiler_rt.zig b/std/special/compiler_rt.zig index 92246970ca..b24a84ac7d 100644 --- a/std/special/compiler_rt.zig +++ b/std/special/compiler_rt.zig @@ -106,7 +106,9 @@ comptime { @export("__divdi3", __divdi3, linkage); @export("__udivsi3", __udivsi3, linkage); @export("__udivdi3", __udivdi3, linkage); + @export("__modsi3", __modsi3, linkage); @export("__moddi3", __moddi3, linkage); + @export("__umodsi3", __umodsi3, linkage); @export("__umoddi3", __umoddi3, linkage); @export("__divmodsi4", __divmodsi4, linkage); @export("__udivmodsi4", __udivmodsi4, linkage); @@ -664,6 +666,18 @@ extern fn __udivsi3(n: u32, d: u32) u32 { return q; } +extern fn __modsi3(n: i32, d: i32) i32 { + @setRuntimeSafety(is_test); + + return n -% __divsi3(n, d) *% d; +} + +extern fn __umodsi3(n: u32, d: u32) u32 { + @setRuntimeSafety(is_test); + + return n -% __udivsi3(n, d) *% d; +} + test "test_umoddi3" { test_one_umoddi3(0, 1, 0); test_one_umoddi3(2, 1, 0); @@ -1455,3 +1469,174 @@ fn test_one_moddi3(a: i64, b: i64, expected_r: i64) void { const r: i64 = __moddi3(a, b); testing.expect(r == expected_r); } + +test "test_modsi3" { + const cases = [][3]i32{ + []i32{0, 1, 0}, + []i32{0, -1, 0}, + []i32{5, 3, 2}, + []i32{5, -3, 2}, + []i32{-5, 3, -2}, + []i32{-5, -3, -2}, + []i32{@bitCast(i32, @intCast(u32, 0x80000000)), 1, 0x0}, + []i32{@bitCast(i32, @intCast(u32, 0x80000000)), 2, 0x0}, + []i32{@bitCast(i32, @intCast(u32, 0x80000000)), -2, 0x0}, + []i32{@bitCast(i32, @intCast(u32, 0x80000000)), 3, -2}, + []i32{@bitCast(i32, @intCast(u32, 0x80000000)), -3, -2}, + }; + + for (cases) |case| { + test_one_modsi3(case[0], case[1], case[2]); + } +} + +fn test_one_modsi3(a: i32, b: i32, expected_r: i32) void { + const r: i32 = __modsi3(a, b); + testing.expect(r == expected_r); +} + +test "test_umodsi3" { + const cases = [][3]u32{ + []u32{0x00000000, 0x00000001, 0x00000000}, + []u32{0x00000000, 0x00000002, 0x00000000}, + []u32{0x00000000, 0x00000003, 0x00000000}, + []u32{0x00000000, 0x00000010, 0x00000000}, + []u32{0x00000000, 0x078644FA, 0x00000000}, + []u32{0x00000000, 0x0747AE14, 0x00000000}, + []u32{0x00000000, 0x7FFFFFFF, 0x00000000}, + []u32{0x00000000, 0x80000000, 0x00000000}, + []u32{0x00000000, 0xFFFFFFFD, 0x00000000}, + []u32{0x00000000, 0xFFFFFFFE, 0x00000000}, + []u32{0x00000000, 0xFFFFFFFF, 0x00000000}, + []u32{0x00000001, 0x00000001, 0x00000000}, + []u32{0x00000001, 0x00000002, 0x00000001}, + []u32{0x00000001, 0x00000003, 0x00000001}, + []u32{0x00000001, 0x00000010, 0x00000001}, + []u32{0x00000001, 0x078644FA, 0x00000001}, + []u32{0x00000001, 0x0747AE14, 0x00000001}, + []u32{0x00000001, 0x7FFFFFFF, 0x00000001}, + []u32{0x00000001, 0x80000000, 0x00000001}, + []u32{0x00000001, 0xFFFFFFFD, 0x00000001}, + []u32{0x00000001, 0xFFFFFFFE, 0x00000001}, + []u32{0x00000001, 0xFFFFFFFF, 0x00000001}, + []u32{0x00000002, 0x00000001, 0x00000000}, + []u32{0x00000002, 0x00000002, 0x00000000}, + []u32{0x00000002, 0x00000003, 0x00000002}, + []u32{0x00000002, 0x00000010, 0x00000002}, + []u32{0x00000002, 0x078644FA, 0x00000002}, + []u32{0x00000002, 0x0747AE14, 0x00000002}, + []u32{0x00000002, 0x7FFFFFFF, 0x00000002}, + []u32{0x00000002, 0x80000000, 0x00000002}, + []u32{0x00000002, 0xFFFFFFFD, 0x00000002}, + []u32{0x00000002, 0xFFFFFFFE, 0x00000002}, + []u32{0x00000002, 0xFFFFFFFF, 0x00000002}, + []u32{0x00000003, 0x00000001, 0x00000000}, + []u32{0x00000003, 0x00000002, 0x00000001}, + []u32{0x00000003, 0x00000003, 0x00000000}, + []u32{0x00000003, 0x00000010, 0x00000003}, + []u32{0x00000003, 0x078644FA, 0x00000003}, + []u32{0x00000003, 0x0747AE14, 0x00000003}, + []u32{0x00000003, 0x7FFFFFFF, 0x00000003}, + []u32{0x00000003, 0x80000000, 0x00000003}, + []u32{0x00000003, 0xFFFFFFFD, 0x00000003}, + []u32{0x00000003, 0xFFFFFFFE, 0x00000003}, + []u32{0x00000003, 0xFFFFFFFF, 0x00000003}, + []u32{0x00000010, 0x00000001, 0x00000000}, + []u32{0x00000010, 0x00000002, 0x00000000}, + []u32{0x00000010, 0x00000003, 0x00000001}, + []u32{0x00000010, 0x00000010, 0x00000000}, + []u32{0x00000010, 0x078644FA, 0x00000010}, + []u32{0x00000010, 0x0747AE14, 0x00000010}, + []u32{0x00000010, 0x7FFFFFFF, 0x00000010}, + []u32{0x00000010, 0x80000000, 0x00000010}, + []u32{0x00000010, 0xFFFFFFFD, 0x00000010}, + []u32{0x00000010, 0xFFFFFFFE, 0x00000010}, + []u32{0x00000010, 0xFFFFFFFF, 0x00000010}, + []u32{0x078644FA, 0x00000001, 0x00000000}, + []u32{0x078644FA, 0x00000002, 0x00000000}, + []u32{0x078644FA, 0x00000003, 0x00000000}, + []u32{0x078644FA, 0x00000010, 0x0000000A}, + []u32{0x078644FA, 0x078644FA, 0x00000000}, + []u32{0x078644FA, 0x0747AE14, 0x003E96E6}, + []u32{0x078644FA, 0x7FFFFFFF, 0x078644FA}, + []u32{0x078644FA, 0x80000000, 0x078644FA}, + []u32{0x078644FA, 0xFFFFFFFD, 0x078644FA}, + []u32{0x078644FA, 0xFFFFFFFE, 0x078644FA}, + []u32{0x078644FA, 0xFFFFFFFF, 0x078644FA}, + []u32{0x0747AE14, 0x00000001, 0x00000000}, + []u32{0x0747AE14, 0x00000002, 0x00000000}, + []u32{0x0747AE14, 0x00000003, 0x00000002}, + []u32{0x0747AE14, 0x00000010, 0x00000004}, + []u32{0x0747AE14, 0x078644FA, 0x0747AE14}, + []u32{0x0747AE14, 0x0747AE14, 0x00000000}, + []u32{0x0747AE14, 0x7FFFFFFF, 0x0747AE14}, + []u32{0x0747AE14, 0x80000000, 0x0747AE14}, + []u32{0x0747AE14, 0xFFFFFFFD, 0x0747AE14}, + []u32{0x0747AE14, 0xFFFFFFFE, 0x0747AE14}, + []u32{0x0747AE14, 0xFFFFFFFF, 0x0747AE14}, + []u32{0x7FFFFFFF, 0x00000001, 0x00000000}, + []u32{0x7FFFFFFF, 0x00000002, 0x00000001}, + []u32{0x7FFFFFFF, 0x00000003, 0x00000001}, + []u32{0x7FFFFFFF, 0x00000010, 0x0000000F}, + []u32{0x7FFFFFFF, 0x078644FA, 0x00156B65}, + []u32{0x7FFFFFFF, 0x0747AE14, 0x043D70AB}, + []u32{0x7FFFFFFF, 0x7FFFFFFF, 0x00000000}, + []u32{0x7FFFFFFF, 0x80000000, 0x7FFFFFFF}, + []u32{0x7FFFFFFF, 0xFFFFFFFD, 0x7FFFFFFF}, + []u32{0x7FFFFFFF, 0xFFFFFFFE, 0x7FFFFFFF}, + []u32{0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF}, + []u32{0x80000000, 0x00000001, 0x00000000}, + []u32{0x80000000, 0x00000002, 0x00000000}, + []u32{0x80000000, 0x00000003, 0x00000002}, + []u32{0x80000000, 0x00000010, 0x00000000}, + []u32{0x80000000, 0x078644FA, 0x00156B66}, + []u32{0x80000000, 0x0747AE14, 0x043D70AC}, + []u32{0x80000000, 0x7FFFFFFF, 0x00000001}, + []u32{0x80000000, 0x80000000, 0x00000000}, + []u32{0x80000000, 0xFFFFFFFD, 0x80000000}, + []u32{0x80000000, 0xFFFFFFFE, 0x80000000}, + []u32{0x80000000, 0xFFFFFFFF, 0x80000000}, + []u32{0xFFFFFFFD, 0x00000001, 0x00000000}, + []u32{0xFFFFFFFD, 0x00000002, 0x00000001}, + []u32{0xFFFFFFFD, 0x00000003, 0x00000001}, + []u32{0xFFFFFFFD, 0x00000010, 0x0000000D}, + []u32{0xFFFFFFFD, 0x078644FA, 0x002AD6C9}, + []u32{0xFFFFFFFD, 0x0747AE14, 0x01333341}, + []u32{0xFFFFFFFD, 0x7FFFFFFF, 0x7FFFFFFE}, + []u32{0xFFFFFFFD, 0x80000000, 0x7FFFFFFD}, + []u32{0xFFFFFFFD, 0xFFFFFFFD, 0x00000000}, + []u32{0xFFFFFFFD, 0xFFFFFFFE, 0xFFFFFFFD}, + []u32{0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFD}, + []u32{0xFFFFFFFE, 0x00000001, 0x00000000}, + []u32{0xFFFFFFFE, 0x00000002, 0x00000000}, + []u32{0xFFFFFFFE, 0x00000003, 0x00000002}, + []u32{0xFFFFFFFE, 0x00000010, 0x0000000E}, + []u32{0xFFFFFFFE, 0x078644FA, 0x002AD6CA}, + []u32{0xFFFFFFFE, 0x0747AE14, 0x01333342}, + []u32{0xFFFFFFFE, 0x7FFFFFFF, 0x00000000}, + []u32{0xFFFFFFFE, 0x80000000, 0x7FFFFFFE}, + []u32{0xFFFFFFFE, 0xFFFFFFFD, 0x00000001}, + []u32{0xFFFFFFFE, 0xFFFFFFFE, 0x00000000}, + []u32{0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFE}, + []u32{0xFFFFFFFF, 0x00000001, 0x00000000}, + []u32{0xFFFFFFFF, 0x00000002, 0x00000001}, + []u32{0xFFFFFFFF, 0x00000003, 0x00000000}, + []u32{0xFFFFFFFF, 0x00000010, 0x0000000F}, + []u32{0xFFFFFFFF, 0x078644FA, 0x002AD6CB}, + []u32{0xFFFFFFFF, 0x0747AE14, 0x01333343}, + []u32{0xFFFFFFFF, 0x7FFFFFFF, 0x00000001}, + []u32{0xFFFFFFFF, 0x80000000, 0x7FFFFFFF}, + []u32{0xFFFFFFFF, 0xFFFFFFFD, 0x00000002}, + []u32{0xFFFFFFFF, 0xFFFFFFFE, 0x00000001}, + []u32{0xFFFFFFFF, 0xFFFFFFFF, 0x00000000} + }; + + for (cases) |case| { + test_one_umodsi3(case[0], case[1], case[2]); + } +} + +fn test_one_umodsi3(a: u32, b: u32, expected_r: u32) void { + const r: u32 = __umodsi3(a, b); + testing.expect(r == expected_r); +} |
