Commit 3c22cecee2

matu3ba <anon_1plus1equals3@mailbox.org>
2023-10-20 09:57:11
compiler_rt: add tests for arm routines (#17573)
* __aeabi_ldivmod * __aeabi_uldivmod * __aeabi_idivmod * __aeabi_uidivmod
1 parent a361f37
Changed files (3)
lib/compiler_rt/int.zig
@@ -10,6 +10,7 @@ const is_test = builtin.is_test;
 const common = @import("common.zig");
 const udivmod = @import("udivmod.zig").udivmod;
 const __divti3 = @import("divti3.zig").__divti3;
+const arm = @import("arm.zig");
 
 pub const panic = common.panic;
 
@@ -73,31 +74,51 @@ pub fn __divmoddi4(a: i64, b: i64, rem: *i64) callconv(.C) i64 {
     return d;
 }
 
-test "test_divmoddi4" {
-    const cases = [_][4]i64{
-        [_]i64{ 0, 1, 0, 0 },
-        [_]i64{ 0, -1, 0, 0 },
-        [_]i64{ 2, 1, 2, 0 },
-        [_]i64{ 2, -1, -2, 0 },
-        [_]i64{ -2, 1, -2, 0 },
-        [_]i64{ -2, -1, 2, 0 },
-        [_]i64{ 7, 5, 1, 2 },
-        [_]i64{ -7, 5, -1, -2 },
-        [_]i64{ 19, 5, 3, 4 },
-        [_]i64{ 19, -5, -3, 4 },
-        [_]i64{ @bitCast(@as(u64, 0x8000000000000000)), 8, @bitCast(@as(u64, 0xf000000000000000)), 0 },
-        [_]i64{ @bitCast(@as(u64, 0x8000000000000007)), 8, @bitCast(@as(u64, 0xf000000000000001)), -1 },
-    };
+fn test_one_divmoddi4(a: i64, b: i64, expected_q: i64, expected_r: i64) !void {
+    var r: i64 = undefined;
+    const q: i64 = __divmoddi4(a, b, &r);
+    try testing.expect(q == expected_q and r == expected_r);
+}
 
-    for (cases) |case| {
+const cases__divmoddi4 =
+    [_][4]i64{
+    [_]i64{ 0, 1, 0, 0 },
+    [_]i64{ 0, -1, 0, 0 },
+    [_]i64{ 2, 1, 2, 0 },
+    [_]i64{ 2, -1, -2, 0 },
+    [_]i64{ -2, 1, -2, 0 },
+    [_]i64{ -2, -1, 2, 0 },
+    [_]i64{ 7, 5, 1, 2 },
+    [_]i64{ -7, 5, -1, -2 },
+    [_]i64{ 19, 5, 3, 4 },
+    [_]i64{ 19, -5, -3, 4 },
+    [_]i64{ @as(i64, @bitCast(@as(u64, 0x8000000000000000))), 8, @as(i64, @bitCast(@as(u64, 0xf000000000000000))), 0 },
+    [_]i64{ @as(i64, @bitCast(@as(u64, 0x8000000000000007))), 8, @as(i64, @bitCast(@as(u64, 0xf000000000000001))), -1 },
+};
+
+test "test_divmoddi4" {
+    for (cases__divmoddi4) |case| {
         try test_one_divmoddi4(case[0], case[1], case[2], case[3]);
     }
 }
 
-fn test_one_divmoddi4(a: i64, b: i64, expected_q: i64, expected_r: i64) !void {
-    var r: i64 = undefined;
-    const q: i64 = __divmoddi4(a, b, &r);
-    try testing.expect(q == expected_q and r == expected_r);
+fn test_one_aeabi_ldivmod(a: i64, b: i64, expected_q: i64, expected_r: i64) !void {
+    const LdivmodRes = extern struct {
+        q: i64, // r1:r0
+        r: i64, // r3:r2
+    };
+    const actualIdivmod = @as(*const fn (a: i64, b: i64) callconv(.AAPCS) LdivmodRes, @ptrCast(&arm.__aeabi_ldivmod));
+    const arm_res = actualIdivmod(a, b);
+    try testing.expectEqual(expected_q, arm_res.q);
+    try testing.expectEqual(expected_r, arm_res.r);
+}
+
+test "arm.__aeabi_ldivmod" {
+    if (!builtin.cpu.arch.isARM()) return error.SkipZigTest;
+
+    for (cases__divmodsi4) |case| {
+        try test_one_aeabi_ldivmod(case[0], case[1], case[2], case[3]);
+    }
 }
 
 pub fn __udivmoddi4(a: u64, b: u64, maybe_rem: ?*u64) callconv(.C) u64 {
@@ -212,27 +233,21 @@ pub fn __divmodsi4(a: i32, b: i32, rem: *i32) callconv(.C) i32 {
     return d;
 }
 
-test "test_divmodsi4" {
-    const cases = [_][4]i32{
-        [_]i32{ 0, 1, 0, 0 },
-        [_]i32{ 0, -1, 0, 0 },
-        [_]i32{ 2, 1, 2, 0 },
-        [_]i32{ 2, -1, -2, 0 },
-        [_]i32{ -2, 1, -2, 0 },
-        [_]i32{ -2, -1, 2, 0 },
-        [_]i32{ 7, 5, 1, 2 },
-        [_]i32{ -7, 5, -1, -2 },
-        [_]i32{ 19, 5, 3, 4 },
-        [_]i32{ 19, -5, -3, 4 },
-
-        [_]i32{ @bitCast(@as(u32, 0x80000000)), 8, @bitCast(@as(u32, 0xf0000000)), 0 },
-        [_]i32{ @bitCast(@as(u32, 0x80000007)), 8, @bitCast(@as(u32, 0xf0000001)), -1 },
-    };
-
-    for (cases) |case| {
-        try test_one_divmodsi4(case[0], case[1], case[2], case[3]);
-    }
-}
+const cases__divmodsi4 =
+    [_][4]i32{
+    [_]i32{ 0, 1, 0, 0 },
+    [_]i32{ 0, -1, 0, 0 },
+    [_]i32{ 2, 1, 2, 0 },
+    [_]i32{ 2, -1, -2, 0 },
+    [_]i32{ -2, 1, -2, 0 },
+    [_]i32{ -2, -1, 2, 0 },
+    [_]i32{ 7, 5, 1, 2 },
+    [_]i32{ -7, 5, -1, -2 },
+    [_]i32{ 19, 5, 3, 4 },
+    [_]i32{ 19, -5, -3, 4 },
+    [_]i32{ @bitCast(@as(u32, 0x80000000)), 8, @bitCast(@as(u32, 0xf0000000)), 0 },
+    [_]i32{ @bitCast(@as(u32, 0x80000007)), 8, @bitCast(@as(u32, 0xf0000001)), -1 },
+};
 
 fn test_one_divmodsi4(a: i32, b: i32, expected_q: i32, expected_r: i32) !void {
     var r: i32 = undefined;
@@ -240,6 +255,31 @@ fn test_one_divmodsi4(a: i32, b: i32, expected_q: i32, expected_r: i32) !void {
     try testing.expect(q == expected_q and r == expected_r);
 }
 
+test "test_divmodsi4" {
+    for (cases__divmodsi4) |case| {
+        try test_one_divmodsi4(case[0], case[1], case[2], case[3]);
+    }
+}
+
+fn test_one_aeabi_idivmod(a: i32, b: i32, expected_q: i32, expected_r: i32) !void {
+    const IdivmodRes = extern struct {
+        q: i32, // r0
+        r: i32, // r1
+    };
+    const actualIdivmod = @as(*const fn (a: i32, b: i32) callconv(.AAPCS) IdivmodRes, @ptrCast(&arm.__aeabi_idivmod));
+    const arm_res = actualIdivmod(a, b);
+    try testing.expectEqual(expected_q, arm_res.q);
+    try testing.expectEqual(expected_r, arm_res.r);
+}
+
+test "arm.__aeabi_idivmod" {
+    if (!builtin.cpu.arch.isARM()) return error.SkipZigTest;
+
+    for (cases__divmodsi4) |case| {
+        try test_one_aeabi_idivmod(case[0], case[1], case[2], case[3]);
+    }
+}
+
 pub fn __udivmodsi4(a: u32, b: u32, rem: *u32) callconv(.C) u32 {
     const d = __udivsi3(a, b);
     rem.* = @bitCast(@as(i32, @bitCast(a)) -% (@as(i32, @bitCast(d)) * @as(i32, @bitCast(b))));
lib/compiler_rt/udivmoddi4_test.zig
@@ -1,7 +1,9 @@
 // Disable formatting to avoid unnecessary source repository bloat.
 // zig fmt: off
-const __udivmoddi4 = @import("int.zig").__udivmoddi4;
 const testing = @import("std").testing;
+const builtin = @import("builtin");
+const __udivmoddi4 = @import("int.zig").__udivmoddi4;
+const __aeabi_uldivmod = @import("arm.zig").__aeabi_uldivmod;
 
 fn test__udivmoddi4(a: u64, b: u64, expected_q: u64, expected_r: u64) !void {
     var r: u64 = undefined;
@@ -16,6 +18,26 @@ test "udivmoddi4" {
     }
 }
 
+const ARMRes = extern struct {
+    q: u64, // r1:r0
+    r: u64, // r3:r2
+};
+
+fn test__aeabi_uldivmod(a: u64, b: u64, expected_q: u64, expected_r: u64) !void {
+    const actualUldivmod = @as(*const fn (a: u64, b: u64) callconv(.AAPCS) ARMRes, @ptrCast(&__aeabi_uldivmod));
+    const arm_res = actualUldivmod(a, b);
+    try testing.expectEqual(expected_q, arm_res.q);
+    try testing.expectEqual(expected_r, arm_res.r);
+}
+
+test "arm.__aeabi_uldivmod" {
+    if (!builtin.cpu.arch.isARM()) return error.SkipZigTest;
+
+    for (cases) |case| {
+        try test__aeabi_uldivmod(case[0], case[1], case[2], case[3]);
+    }
+}
+
 const cases = [_][4]u64{
     [_]u64{0x0000000000000000, 0x0000000000000001, 0x0000000000000000, 0x0000000000000000},
     [_]u64{0x0000000000000000, 0x0000000000000002, 0x0000000000000000, 0x0000000000000000},
lib/compiler_rt/udivmodsi4_test.zig
@@ -0,0 +1,165 @@
+// Disable formatting to avoid unnecessary source repository bloat.
+// zig fmt: off
+const testing = @import("std").testing;
+const builtin = @import("builtin");
+const __aeabi_uidivmod = @import("arm.zig").__aeabi_uidivmod;
+
+const ARMRes = extern struct {
+    q: u32, // r0
+    r: u32, // r1
+};
+
+fn test__aeabi_uidivmod(a: u32, b: u32, expected_q: u32, expected_r: u32) !void {
+    const actualUidivmod = @as(*const fn (a: u32, b: u32) callconv(.AAPCS) ARMRes, @ptrCast(&__aeabi_uidivmod));
+    const arm_res = actualUidivmod(a, b);
+    try testing.expectEqual(expected_q, arm_res.q);
+    try testing.expectEqual(expected_r, arm_res.r);
+}
+
+test "arm.__aeabi_uidivmod" {
+    if (!builtin.cpu.arch.isARM()) return error.SkipZigTest;
+
+    var i: i32 = 0;
+    for (cases) |case| {
+        try test__aeabi_uidivmod(case[0], case[1], case[2], case[3]);
+        i+=1;
+    }
+}
+
+const cases = [_][4]u32{
+    [_]u32{0x00000000, 0x00000001, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0x00000002, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0x00000003, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0x00000010, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0x078644FA, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0x0747AE14, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0x7FFFFFFF, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0x80000000, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0xFFFFFFFD, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0xFFFFFFFE, 0x00000000, 0x00000000},
+    [_]u32{0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000},
+    [_]u32{0x00000001, 0x00000001, 0x00000001, 0x00000000}, // 1/1 => q=1, r=0
+    [_]u32{0x00000001, 0x00000002, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x00000003, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x00000010, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x078644FA, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x0747AE14, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x7FFFFFFF, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x80000000, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0xFFFFFFFD, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0xFFFFFFFE, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0xFFFFFFFF, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x00000000, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x00000001, 0x00000001, 0x00000000},
+    [_]u32{0x00000001, 0x00000002, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x00000003, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x00000010, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x078644FA, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x0747AE14, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x7FFFFFFF, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0x80000000, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0xFFFFFFFD, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0xFFFFFFFE, 0x00000000, 0x00000001},
+    [_]u32{0x00000001, 0xFFFFFFFF, 0x00000000, 0x00000001},
+    [_]u32{0x00000002, 0x00000001, 0x00000002, 0x00000000},
+    [_]u32{0x00000002, 0x00000002, 0x00000001, 0x00000000},
+    [_]u32{0x00000002, 0x00000003, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0x00000010, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0x078644FA, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0x0747AE14, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0x7FFFFFFF, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0x80000000, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0xFFFFFFFD, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0xFFFFFFFE, 0x00000000, 0x00000002},
+    [_]u32{0x00000002, 0xFFFFFFFF, 0x00000000, 0x00000002},
+
+    [_]u32{0x00000010, 0x00000001, 0x00000010, 0x00000000},
+    [_]u32{0x00000010, 0x00000002, 0x00000008, 0x00000000},
+    [_]u32{0x00000010, 0x00000003, 0x00000005, 0x00000001},
+    [_]u32{0x00000010, 0x00000010, 0x00000001, 0x00000000},
+    [_]u32{0x00000010, 0x078644FA, 0x00000000, 0x00000010},
+    [_]u32{0x00000010, 0x0747AE14, 0x00000000, 0x00000010},
+    [_]u32{0x00000010, 0x7FFFFFFF, 0x00000000, 0x00000010},
+    [_]u32{0x00000010, 0x80000000, 0x00000000, 0x00000010},
+    [_]u32{0x00000010, 0xFFFFFFFD, 0x00000000, 0x00000010},
+    [_]u32{0x00000010, 0xFFFFFFFE, 0x00000000, 0x00000010},
+    [_]u32{0x00000010, 0xFFFFFFFF, 0x00000000, 0x00000010},
+
+    [_]u32{0x078644FA, 0x00000001, 0x078644FA, 0x00000000},
+    [_]u32{0x078644FA, 0x00000002, 0x03C3227D, 0x00000000},
+    [_]u32{0x078644FA, 0x00000003, 0x028216FE, 0x00000000},
+    [_]u32{0x078644FA, 0x00000010, 0x0078644F, 0x0000000A},
+    [_]u32{0x078644FA, 0x078644FA, 0x00000001, 0x00000000},
+    [_]u32{0x078644FA, 0x0747AE14, 0x00000001, 0x003E96E6},
+    [_]u32{0x078644FA, 0x7FFFFFFF, 0x00000000, 0x078644FA},
+    [_]u32{0x078644FA, 0x80000000, 0x00000000, 0x078644FA},
+    [_]u32{0x078644FA, 0xFFFFFFFD, 0x00000000, 0x078644FA},
+    [_]u32{0x078644FA, 0xFFFFFFFE, 0x00000000, 0x078644FA},
+    [_]u32{0x078644FA, 0xFFFFFFFF, 0x00000000, 0x078644FA},
+    [_]u32{0x0747AE14, 0x00000001, 0x0747AE14, 0x00000000},
+    [_]u32{0x0747AE14, 0x00000002, 0x03A3D70A, 0x00000000},
+    [_]u32{0x0747AE14, 0x00000003, 0x026D3A06, 0x00000002},
+    [_]u32{0x0747AE14, 0x00000010, 0x00747AE1, 0x00000004},
+    [_]u32{0x0747AE14, 0x078644FA, 0x00000000, 0x0747AE14},
+    [_]u32{0x0747AE14, 0x0747AE14, 0x00000001, 0x00000000},
+    [_]u32{0x0747AE14, 0x7FFFFFFF, 0x00000000, 0x0747AE14},
+    [_]u32{0x0747AE14, 0x80000000, 0x00000000, 0x0747AE14},
+    [_]u32{0x0747AE14, 0xFFFFFFFD, 0x00000000, 0x0747AE14},
+    [_]u32{0x0747AE14, 0xFFFFFFFE, 0x00000000, 0x0747AE14},
+    [_]u32{0x0747AE14, 0xFFFFFFFF, 0x00000000, 0x0747AE14},
+    [_]u32{0x7FFFFFFF, 0x00000001, 0x7FFFFFFF, 0x00000000},
+    [_]u32{0x7FFFFFFF, 0x00000002, 0x3FFFFFFF, 0x00000001},
+    [_]u32{0x7FFFFFFF, 0x00000003, 0x2AAAAAAA, 0x00000001},
+    [_]u32{0x7FFFFFFF, 0x00000010, 0x07FFFFFF, 0x0000000F},
+    [_]u32{0x7FFFFFFF, 0x078644FA, 0x00000011, 0x00156B65},
+    [_]u32{0x7FFFFFFF, 0x0747AE14, 0x00000011, 0x043D70AB},
+    [_]u32{0x7FFFFFFF, 0x7FFFFFFF, 0x00000001, 0x00000000},
+    [_]u32{0x7FFFFFFF, 0x80000000, 0x00000000, 0x7FFFFFFF},
+    [_]u32{0x7FFFFFFF, 0xFFFFFFFD, 0x00000000, 0x7FFFFFFF},
+    [_]u32{0x7FFFFFFF, 0xFFFFFFFE, 0x00000000, 0x7FFFFFFF},
+    [_]u32{0x7FFFFFFF, 0xFFFFFFFF, 0x00000000, 0x7FFFFFFF},
+    [_]u32{0x80000000, 0x00000001, 0x80000000, 0x00000000},
+    [_]u32{0x80000000, 0x00000002, 0x40000000, 0x00000000},
+    [_]u32{0x80000000, 0x00000003, 0x2AAAAAAA, 0x00000002},
+    [_]u32{0x80000000, 0x00000010, 0x08000000, 0x00000000},
+    [_]u32{0x80000000, 0x078644FA, 0x00000011, 0x00156B66},
+    [_]u32{0x80000000, 0x0747AE14, 0x00000011, 0x043D70AC},
+    [_]u32{0x80000000, 0x7FFFFFFF, 0x00000001, 0x00000001},
+    [_]u32{0x80000000, 0x80000000, 0x00000001, 0x00000000},
+    [_]u32{0x80000000, 0xFFFFFFFD, 0x00000000, 0x80000000},
+    [_]u32{0x80000000, 0xFFFFFFFE, 0x00000000, 0x80000000},
+    [_]u32{0x80000000, 0xFFFFFFFF, 0x00000000, 0x80000000},
+    [_]u32{0xFFFFFFFD, 0x00000001, 0xFFFFFFFD, 0x00000000},
+    [_]u32{0xFFFFFFFD, 0x00000002, 0x7FFFFFFE, 0x00000001},
+    [_]u32{0xFFFFFFFD, 0x00000003, 0x55555554, 0x00000001},
+    [_]u32{0xFFFFFFFD, 0x00000010, 0x0FFFFFFF, 0x0000000D},
+    [_]u32{0xFFFFFFFD, 0x078644FA, 0x00000022, 0x002AD6C9},
+    [_]u32{0xFFFFFFFD, 0x0747AE14, 0x00000023, 0x01333341},
+    [_]u32{0xFFFFFFFD, 0x7FFFFFFF, 0x00000001, 0x7FFFFFFE},
+    [_]u32{0xFFFFFFFD, 0x80000000, 0x00000001, 0x7FFFFFFD},
+    [_]u32{0xFFFFFFFD, 0xFFFFFFFD, 0x00000001, 0x00000000},
+    [_]u32{0xFFFFFFFD, 0xFFFFFFFE, 0x00000000, 0xFFFFFFFD},
+    [_]u32{0xFFFFFFFD, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFD},
+    [_]u32{0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000000},
+    [_]u32{0xFFFFFFFE, 0x00000002, 0x7FFFFFFF, 0x00000000},
+    [_]u32{0xFFFFFFFE, 0x00000003, 0x55555554, 0x00000002},
+    [_]u32{0xFFFFFFFE, 0x00000010, 0x0FFFFFFF, 0x0000000E},
+    [_]u32{0xFFFFFFFE, 0x078644FA, 0x00000022, 0x002AD6CA},
+    [_]u32{0xFFFFFFFE, 0x0747AE14, 0x00000023, 0x01333342},
+    [_]u32{0xFFFFFFFE, 0x7FFFFFFF, 0x00000002, 0x00000000},
+    [_]u32{0xFFFFFFFE, 0x80000000, 0x00000001, 0x7FFFFFFE},
+    [_]u32{0xFFFFFFFE, 0xFFFFFFFD, 0x00000001, 0x00000001},
+    [_]u32{0xFFFFFFFE, 0xFFFFFFFE, 0x00000001, 0x00000000},
+    [_]u32{0xFFFFFFFE, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFE},
+    [_]u32{0xFFFFFFFF, 0x00000001, 0xFFFFFFFF, 0x00000000},
+    [_]u32{0xFFFFFFFF, 0x00000002, 0x7FFFFFFF, 0x00000001},
+    [_]u32{0xFFFFFFFF, 0x00000003, 0x55555555, 0x00000000},
+    [_]u32{0xFFFFFFFF, 0x00000010, 0x0FFFFFFF, 0x0000000F},
+    [_]u32{0xFFFFFFFF, 0x078644FA, 0x00000022, 0x002AD6CB},
+    [_]u32{0xFFFFFFFF, 0x0747AE14, 0x00000023, 0x01333343},
+    [_]u32{0xFFFFFFFF, 0x7FFFFFFF, 0x00000002, 0x00000001},
+    [_]u32{0xFFFFFFFF, 0x80000000, 0x00000001, 0x7FFFFFFF},
+    [_]u32{0xFFFFFFFF, 0xFFFFFFFD, 0x00000001, 0x00000002},
+    [_]u32{0xFFFFFFFF, 0xFFFFFFFE, 0x00000001, 0x00000001},
+    [_]u32{0xFFFFFFFF, 0xFFFFFFFF, 0x00000001, 0x00000000},
+};