zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

blob fda8d9d8 (25153B) - Raw


      1 const builtin = @import("builtin");
      2 const is_test = builtin.is_test;
      3 
      4 comptime {
      5     const linkage = if (is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.Weak;
      6     const strong_linkage = if (is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.Strong;
      7 
      8     @export("__letf2", @import("comparetf2.zig").__letf2, linkage);
      9     @export("__getf2", @import("comparetf2.zig").__getf2, linkage);
     10 
     11     if (!is_test) {
     12         // only create these aliases when not testing
     13         @export("__cmptf2", @import("comparetf2.zig").__letf2, linkage);
     14         @export("__eqtf2", @import("comparetf2.zig").__letf2, linkage);
     15         @export("__lttf2", @import("comparetf2.zig").__letf2, linkage);
     16         @export("__netf2", @import("comparetf2.zig").__letf2, linkage);
     17         @export("__gttf2", @import("comparetf2.zig").__getf2, linkage);
     18         @export("__gnu_h2f_ieee", @import("extendXfYf2.zig").__extendhfsf2, linkage);
     19         @export("__gnu_f2h_ieee", @import("truncXfYf2.zig").__truncsfhf2, linkage);
     20     }
     21 
     22     @export("__unordtf2", @import("comparetf2.zig").__unordtf2, linkage);
     23 
     24     @export("__floatuntidf", @import("floatuntidf.zig").__floatuntidf, linkage);
     25     @export("__extenddftf2", @import("extendXfYf2.zig").__extenddftf2, linkage);
     26     @export("__extendsftf2", @import("extendXfYf2.zig").__extendsftf2, linkage);
     27     @export("__extendhfsf2", @import("extendXfYf2.zig").__extendhfsf2, linkage);
     28 
     29     @export("__truncsfhf2", @import("truncXfYf2.zig").__truncsfhf2, linkage);
     30 
     31     @export("__fixunssfsi", @import("fixunssfsi.zig").__fixunssfsi, linkage);
     32     @export("__fixunssfdi", @import("fixunssfdi.zig").__fixunssfdi, linkage);
     33     @export("__fixunssfti", @import("fixunssfti.zig").__fixunssfti, linkage);
     34 
     35     @export("__fixunsdfsi", @import("fixunsdfsi.zig").__fixunsdfsi, linkage);
     36     @export("__fixunsdfdi", @import("fixunsdfdi.zig").__fixunsdfdi, linkage);
     37     @export("__fixunsdfti", @import("fixunsdfti.zig").__fixunsdfti, linkage);
     38 
     39     @export("__fixunstfsi", @import("fixunstfsi.zig").__fixunstfsi, linkage);
     40     @export("__fixunstfdi", @import("fixunstfdi.zig").__fixunstfdi, linkage);
     41     @export("__fixunstfti", @import("fixunstfti.zig").__fixunstfti, linkage);
     42 
     43     @export("__udivmoddi4", @import("udivmoddi4.zig").__udivmoddi4, linkage);
     44 
     45     @export("__udivsi3", __udivsi3, linkage);
     46     @export("__udivdi3", __udivdi3, linkage);
     47     @export("__umoddi3", __umoddi3, linkage);
     48     @export("__udivmodsi4", __udivmodsi4, linkage);
     49 
     50     if (isArmArch()) {
     51         @export("__aeabi_uldivmod", __aeabi_uldivmod, linkage);
     52         @export("__aeabi_uidivmod", __aeabi_uidivmod, linkage);
     53         @export("__aeabi_uidiv", __udivsi3, linkage);
     54     }
     55     if (builtin.os == builtin.Os.windows) {
     56         switch (builtin.arch) {
     57             builtin.Arch.i386 => {
     58                 if (!builtin.link_libc) {
     59                     @export("_chkstk", _chkstk, strong_linkage);
     60                     @export("__chkstk_ms", __chkstk_ms, linkage);
     61                 }
     62                 @export("_aulldiv", @import("aulldiv.zig")._aulldiv, strong_linkage);
     63                 @export("_aullrem", @import("aullrem.zig")._aullrem, strong_linkage);
     64             },
     65             builtin.Arch.x86_64 => {
     66                 if (!builtin.link_libc) {
     67                     @export("__chkstk", __chkstk, strong_linkage);
     68                     @export("___chkstk_ms", ___chkstk_ms, linkage);
     69                 }
     70                 @export("__divti3", @import("divti3.zig").__divti3_windows_x86_64, linkage);
     71                 @export("__muloti4", @import("muloti4.zig").__muloti4_windows_x86_64, linkage);
     72                 @export("__udivti3", @import("udivti3.zig").__udivti3_windows_x86_64, linkage);
     73                 @export("__udivmodti4", @import("udivmodti4.zig").__udivmodti4_windows_x86_64, linkage);
     74                 @export("__umodti3", @import("umodti3.zig").__umodti3_windows_x86_64, linkage);
     75             },
     76             else => {},
     77         }
     78     } else {
     79         @export("__divti3", @import("divti3.zig").__divti3, linkage);
     80         @export("__muloti4", @import("muloti4.zig").__muloti4, linkage);
     81         @export("__udivti3", @import("udivti3.zig").__udivti3, linkage);
     82         @export("__udivmodti4", @import("udivmodti4.zig").__udivmodti4, linkage);
     83         @export("__umodti3", @import("umodti3.zig").__umodti3, linkage);
     84     }
     85 }
     86 
     87 const std = @import("std");
     88 const assert = std.debug.assert;
     89 
     90 const __udivmoddi4 = @import("udivmoddi4.zig").__udivmoddi4;
     91 
     92 // Avoid dragging in the runtime safety mechanisms into this .o file,
     93 // unless we're trying to test this file.
     94 pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn {
     95     @setCold(true);
     96     if (is_test) {
     97         std.debug.panic("{}", msg);
     98     } else {
     99         unreachable;
    100     }
    101 }
    102 
    103 pub fn setXmm0(comptime T: type, value: T) void {
    104     comptime assert(builtin.arch == builtin.Arch.x86_64);
    105     const aligned_value: T align(16) = value;
    106     asm volatile (
    107         \\movaps (%[ptr]), %%xmm0
    108             :
    109         : [ptr] "r" (&aligned_value)
    110         : "xmm0"
    111     );
    112 }
    113 
    114 extern fn __udivdi3(a: u64, b: u64) u64 {
    115     @setRuntimeSafety(is_test);
    116     return __udivmoddi4(a, b, null);
    117 }
    118 
    119 extern fn __umoddi3(a: u64, b: u64) u64 {
    120     @setRuntimeSafety(is_test);
    121 
    122     var r: u64 = undefined;
    123     _ = __udivmoddi4(a, b, &r);
    124     return r;
    125 }
    126 
    127 const AeabiUlDivModResult = extern struct {
    128     quot: u64,
    129     rem: u64,
    130 };
    131 extern fn __aeabi_uldivmod(numerator: u64, denominator: u64) AeabiUlDivModResult {
    132     @setRuntimeSafety(is_test);
    133     var result: AeabiUlDivModResult = undefined;
    134     result.quot = __udivmoddi4(numerator, denominator, &result.rem);
    135     return result;
    136 }
    137 
    138 fn isArmArch() bool {
    139     return switch (builtin.arch) {
    140         builtin.Arch.armv8_2a,
    141         builtin.Arch.armv8_1a,
    142         builtin.Arch.armv8,
    143         builtin.Arch.armv8r,
    144         builtin.Arch.armv8m_baseline,
    145         builtin.Arch.armv8m_mainline,
    146         builtin.Arch.armv7,
    147         builtin.Arch.armv7em,
    148         builtin.Arch.armv7m,
    149         builtin.Arch.armv7s,
    150         builtin.Arch.armv7k,
    151         builtin.Arch.armv6,
    152         builtin.Arch.armv6m,
    153         builtin.Arch.armv6k,
    154         builtin.Arch.armv6t2,
    155         builtin.Arch.armv5,
    156         builtin.Arch.armv5te,
    157         builtin.Arch.armv4t,
    158         builtin.Arch.armebv8_2a,
    159         builtin.Arch.armebv8_1a,
    160         builtin.Arch.armebv8,
    161         builtin.Arch.armebv8r,
    162         builtin.Arch.armebv8m_baseline,
    163         builtin.Arch.armebv8m_mainline,
    164         builtin.Arch.armebv7,
    165         builtin.Arch.armebv7em,
    166         builtin.Arch.armebv7m,
    167         builtin.Arch.armebv7s,
    168         builtin.Arch.armebv7k,
    169         builtin.Arch.armebv6,
    170         builtin.Arch.armebv6m,
    171         builtin.Arch.armebv6k,
    172         builtin.Arch.armebv6t2,
    173         builtin.Arch.armebv5,
    174         builtin.Arch.armebv5te,
    175         builtin.Arch.armebv4t,
    176         => true,
    177         else => false,
    178     };
    179 }
    180 
    181 nakedcc fn __aeabi_uidivmod() void {
    182     @setRuntimeSafety(false);
    183     asm volatile (
    184         \\ push    { lr }
    185         \\ sub     sp, sp, #4
    186         \\ mov     r2, sp
    187         \\ bl      __udivmodsi4
    188         \\ ldr     r1, [sp]
    189         \\ add     sp, sp, #4
    190         \\ pop     { pc }
    191             :
    192         :
    193         : "r2", "r1"
    194     );
    195 }
    196 
    197 // _chkstk (_alloca) routine - probe stack between %esp and (%esp-%eax) in 4k increments,
    198 // then decrement %esp by %eax.  Preserves all registers except %esp and flags.
    199 // This routine is windows specific
    200 // http://msdn.microsoft.com/en-us/library/ms648426.aspx
    201 nakedcc fn _chkstk() align(4) void {
    202     @setRuntimeSafety(false);
    203 
    204     asm volatile (
    205         \\         push   %%ecx
    206         \\         push   %%eax
    207         \\         cmp    $0x1000,%%eax
    208         \\         lea    12(%%esp),%%ecx
    209         \\         jb     1f
    210         \\ 2:
    211         \\         sub    $0x1000,%%ecx
    212         \\         test   %%ecx,(%%ecx)
    213         \\         sub    $0x1000,%%eax
    214         \\         cmp    $0x1000,%%eax
    215         \\         ja     2b
    216         \\ 1:
    217         \\         sub    %%eax,%%ecx
    218         \\         test   %%ecx,(%%ecx)
    219         \\         pop    %%eax
    220         \\         pop    %%ecx
    221         \\         ret
    222     );
    223 }
    224 
    225 nakedcc fn __chkstk() align(4) void {
    226     @setRuntimeSafety(false);
    227 
    228     asm volatile (
    229         \\        push   %%rcx
    230         \\        push   %%rax
    231         \\        cmp    $0x1000,%%rax
    232         \\        lea    24(%%rsp),%%rcx
    233         \\        jb     1f
    234         \\2:
    235         \\        sub    $0x1000,%%rcx
    236         \\        test   %%rcx,(%%rcx)
    237         \\        sub    $0x1000,%%rax
    238         \\        cmp    $0x1000,%%rax
    239         \\        ja     2b
    240         \\1:
    241         \\        sub    %%rax,%%rcx
    242         \\        test   %%rcx,(%%rcx)
    243         \\        pop    %%rax
    244         \\        pop    %%rcx
    245         \\        ret
    246     );
    247 }
    248 
    249 // _chkstk routine
    250 // This routine is windows specific
    251 // http://msdn.microsoft.com/en-us/library/ms648426.aspx
    252 nakedcc fn __chkstk_ms() align(4) void {
    253     @setRuntimeSafety(false);
    254 
    255     asm volatile (
    256         \\         push   %%ecx
    257         \\         push   %%eax
    258         \\         cmp    $0x1000,%%eax
    259         \\         lea    12(%%esp),%%ecx
    260         \\         jb     1f
    261         \\ 2:
    262         \\         sub    $0x1000,%%ecx
    263         \\         test   %%ecx,(%%ecx)
    264         \\         sub    $0x1000,%%eax
    265         \\         cmp    $0x1000,%%eax
    266         \\         ja     2b
    267         \\ 1:
    268         \\         sub    %%eax,%%ecx
    269         \\         test   %%ecx,(%%ecx)
    270         \\         pop    %%eax
    271         \\         pop    %%ecx
    272         \\         ret
    273     );
    274 }
    275 
    276 nakedcc fn ___chkstk_ms() align(4) void {
    277     @setRuntimeSafety(false);
    278 
    279     asm volatile (
    280         \\        push   %%rcx
    281         \\        push   %%rax
    282         \\        cmp    $0x1000,%%rax
    283         \\        lea    24(%%rsp),%%rcx
    284         \\        jb     1f
    285         \\2:
    286         \\        sub    $0x1000,%%rcx
    287         \\        test   %%rcx,(%%rcx)
    288         \\        sub    $0x1000,%%rax
    289         \\        cmp    $0x1000,%%rax
    290         \\        ja     2b
    291         \\1:
    292         \\        sub    %%rax,%%rcx
    293         \\        test   %%rcx,(%%rcx)
    294         \\        pop    %%rax
    295         \\        pop    %%rcx
    296         \\        ret
    297     );
    298 }
    299 
    300 extern fn __udivmodsi4(a: u32, b: u32, rem: *u32) u32 {
    301     @setRuntimeSafety(is_test);
    302 
    303     const d = __udivsi3(a, b);
    304     rem.* = @bitCast(u32, @bitCast(i32, a) -% (@bitCast(i32, d) * @bitCast(i32, b)));
    305     return d;
    306 }
    307 
    308 extern fn __udivsi3(n: u32, d: u32) u32 {
    309     @setRuntimeSafety(is_test);
    310 
    311     const n_uword_bits: c_uint = u32.bit_count;
    312     // special cases
    313     if (d == 0) return 0; // ?!
    314     if (n == 0) return 0;
    315     var sr = @bitCast(c_uint, c_int(@clz(d)) - c_int(@clz(n)));
    316     // 0 <= sr <= n_uword_bits - 1 or sr large
    317     if (sr > n_uword_bits - 1) {
    318         // d > r
    319         return 0;
    320     }
    321     if (sr == n_uword_bits - 1) {
    322         // d == 1
    323         return n;
    324     }
    325     sr += 1;
    326     // 1 <= sr <= n_uword_bits - 1
    327     // Not a special case
    328     var q: u32 = n << @intCast(u5, n_uword_bits - sr);
    329     var r: u32 = n >> @intCast(u5, sr);
    330     var carry: u32 = 0;
    331     while (sr > 0) : (sr -= 1) {
    332         // r:q = ((r:q)  << 1) | carry
    333         r = (r << 1) | (q >> @intCast(u5, n_uword_bits - 1));
    334         q = (q << 1) | carry;
    335         // carry = 0;
    336         // if (r.all >= d.all)
    337         // {
    338         //      r.all -= d.all;
    339         //      carry = 1;
    340         // }
    341         const s = @intCast(i32, d -% r -% 1) >> @intCast(u5, n_uword_bits - 1);
    342         carry = @intCast(u32, s & 1);
    343         r -= d & @bitCast(u32, s);
    344     }
    345     q = (q << 1) | carry;
    346     return q;
    347 }
    348 
    349 test "test_umoddi3" {
    350     test_one_umoddi3(0, 1, 0);
    351     test_one_umoddi3(2, 1, 0);
    352     test_one_umoddi3(0x8000000000000000, 1, 0x0);
    353     test_one_umoddi3(0x8000000000000000, 2, 0x0);
    354     test_one_umoddi3(0xFFFFFFFFFFFFFFFF, 2, 0x1);
    355 }
    356 
    357 fn test_one_umoddi3(a: u64, b: u64, expected_r: u64) void {
    358     const r = __umoddi3(a, b);
    359     assert(r == expected_r);
    360 }
    361 
    362 test "test_udivsi3" {
    363     const cases = [][3]u32{
    364         []u32{
    365             0x00000000,
    366             0x00000001,
    367             0x00000000,
    368         },
    369         []u32{
    370             0x00000000,
    371             0x00000002,
    372             0x00000000,
    373         },
    374         []u32{
    375             0x00000000,
    376             0x00000003,
    377             0x00000000,
    378         },
    379         []u32{
    380             0x00000000,
    381             0x00000010,
    382             0x00000000,
    383         },
    384         []u32{
    385             0x00000000,
    386             0x078644FA,
    387             0x00000000,
    388         },
    389         []u32{
    390             0x00000000,
    391             0x0747AE14,
    392             0x00000000,
    393         },
    394         []u32{
    395             0x00000000,
    396             0x7FFFFFFF,
    397             0x00000000,
    398         },
    399         []u32{
    400             0x00000000,
    401             0x80000000,
    402             0x00000000,
    403         },
    404         []u32{
    405             0x00000000,
    406             0xFFFFFFFD,
    407             0x00000000,
    408         },
    409         []u32{
    410             0x00000000,
    411             0xFFFFFFFE,
    412             0x00000000,
    413         },
    414         []u32{
    415             0x00000000,
    416             0xFFFFFFFF,
    417             0x00000000,
    418         },
    419         []u32{
    420             0x00000001,
    421             0x00000001,
    422             0x00000001,
    423         },
    424         []u32{
    425             0x00000001,
    426             0x00000002,
    427             0x00000000,
    428         },
    429         []u32{
    430             0x00000001,
    431             0x00000003,
    432             0x00000000,
    433         },
    434         []u32{
    435             0x00000001,
    436             0x00000010,
    437             0x00000000,
    438         },
    439         []u32{
    440             0x00000001,
    441             0x078644FA,
    442             0x00000000,
    443         },
    444         []u32{
    445             0x00000001,
    446             0x0747AE14,
    447             0x00000000,
    448         },
    449         []u32{
    450             0x00000001,
    451             0x7FFFFFFF,
    452             0x00000000,
    453         },
    454         []u32{
    455             0x00000001,
    456             0x80000000,
    457             0x00000000,
    458         },
    459         []u32{
    460             0x00000001,
    461             0xFFFFFFFD,
    462             0x00000000,
    463         },
    464         []u32{
    465             0x00000001,
    466             0xFFFFFFFE,
    467             0x00000000,
    468         },
    469         []u32{
    470             0x00000001,
    471             0xFFFFFFFF,
    472             0x00000000,
    473         },
    474         []u32{
    475             0x00000002,
    476             0x00000001,
    477             0x00000002,
    478         },
    479         []u32{
    480             0x00000002,
    481             0x00000002,
    482             0x00000001,
    483         },
    484         []u32{
    485             0x00000002,
    486             0x00000003,
    487             0x00000000,
    488         },
    489         []u32{
    490             0x00000002,
    491             0x00000010,
    492             0x00000000,
    493         },
    494         []u32{
    495             0x00000002,
    496             0x078644FA,
    497             0x00000000,
    498         },
    499         []u32{
    500             0x00000002,
    501             0x0747AE14,
    502             0x00000000,
    503         },
    504         []u32{
    505             0x00000002,
    506             0x7FFFFFFF,
    507             0x00000000,
    508         },
    509         []u32{
    510             0x00000002,
    511             0x80000000,
    512             0x00000000,
    513         },
    514         []u32{
    515             0x00000002,
    516             0xFFFFFFFD,
    517             0x00000000,
    518         },
    519         []u32{
    520             0x00000002,
    521             0xFFFFFFFE,
    522             0x00000000,
    523         },
    524         []u32{
    525             0x00000002,
    526             0xFFFFFFFF,
    527             0x00000000,
    528         },
    529         []u32{
    530             0x00000003,
    531             0x00000001,
    532             0x00000003,
    533         },
    534         []u32{
    535             0x00000003,
    536             0x00000002,
    537             0x00000001,
    538         },
    539         []u32{
    540             0x00000003,
    541             0x00000003,
    542             0x00000001,
    543         },
    544         []u32{
    545             0x00000003,
    546             0x00000010,
    547             0x00000000,
    548         },
    549         []u32{
    550             0x00000003,
    551             0x078644FA,
    552             0x00000000,
    553         },
    554         []u32{
    555             0x00000003,
    556             0x0747AE14,
    557             0x00000000,
    558         },
    559         []u32{
    560             0x00000003,
    561             0x7FFFFFFF,
    562             0x00000000,
    563         },
    564         []u32{
    565             0x00000003,
    566             0x80000000,
    567             0x00000000,
    568         },
    569         []u32{
    570             0x00000003,
    571             0xFFFFFFFD,
    572             0x00000000,
    573         },
    574         []u32{
    575             0x00000003,
    576             0xFFFFFFFE,
    577             0x00000000,
    578         },
    579         []u32{
    580             0x00000003,
    581             0xFFFFFFFF,
    582             0x00000000,
    583         },
    584         []u32{
    585             0x00000010,
    586             0x00000001,
    587             0x00000010,
    588         },
    589         []u32{
    590             0x00000010,
    591             0x00000002,
    592             0x00000008,
    593         },
    594         []u32{
    595             0x00000010,
    596             0x00000003,
    597             0x00000005,
    598         },
    599         []u32{
    600             0x00000010,
    601             0x00000010,
    602             0x00000001,
    603         },
    604         []u32{
    605             0x00000010,
    606             0x078644FA,
    607             0x00000000,
    608         },
    609         []u32{
    610             0x00000010,
    611             0x0747AE14,
    612             0x00000000,
    613         },
    614         []u32{
    615             0x00000010,
    616             0x7FFFFFFF,
    617             0x00000000,
    618         },
    619         []u32{
    620             0x00000010,
    621             0x80000000,
    622             0x00000000,
    623         },
    624         []u32{
    625             0x00000010,
    626             0xFFFFFFFD,
    627             0x00000000,
    628         },
    629         []u32{
    630             0x00000010,
    631             0xFFFFFFFE,
    632             0x00000000,
    633         },
    634         []u32{
    635             0x00000010,
    636             0xFFFFFFFF,
    637             0x00000000,
    638         },
    639         []u32{
    640             0x078644FA,
    641             0x00000001,
    642             0x078644FA,
    643         },
    644         []u32{
    645             0x078644FA,
    646             0x00000002,
    647             0x03C3227D,
    648         },
    649         []u32{
    650             0x078644FA,
    651             0x00000003,
    652             0x028216FE,
    653         },
    654         []u32{
    655             0x078644FA,
    656             0x00000010,
    657             0x0078644F,
    658         },
    659         []u32{
    660             0x078644FA,
    661             0x078644FA,
    662             0x00000001,
    663         },
    664         []u32{
    665             0x078644FA,
    666             0x0747AE14,
    667             0x00000001,
    668         },
    669         []u32{
    670             0x078644FA,
    671             0x7FFFFFFF,
    672             0x00000000,
    673         },
    674         []u32{
    675             0x078644FA,
    676             0x80000000,
    677             0x00000000,
    678         },
    679         []u32{
    680             0x078644FA,
    681             0xFFFFFFFD,
    682             0x00000000,
    683         },
    684         []u32{
    685             0x078644FA,
    686             0xFFFFFFFE,
    687             0x00000000,
    688         },
    689         []u32{
    690             0x078644FA,
    691             0xFFFFFFFF,
    692             0x00000000,
    693         },
    694         []u32{
    695             0x0747AE14,
    696             0x00000001,
    697             0x0747AE14,
    698         },
    699         []u32{
    700             0x0747AE14,
    701             0x00000002,
    702             0x03A3D70A,
    703         },
    704         []u32{
    705             0x0747AE14,
    706             0x00000003,
    707             0x026D3A06,
    708         },
    709         []u32{
    710             0x0747AE14,
    711             0x00000010,
    712             0x00747AE1,
    713         },
    714         []u32{
    715             0x0747AE14,
    716             0x078644FA,
    717             0x00000000,
    718         },
    719         []u32{
    720             0x0747AE14,
    721             0x0747AE14,
    722             0x00000001,
    723         },
    724         []u32{
    725             0x0747AE14,
    726             0x7FFFFFFF,
    727             0x00000000,
    728         },
    729         []u32{
    730             0x0747AE14,
    731             0x80000000,
    732             0x00000000,
    733         },
    734         []u32{
    735             0x0747AE14,
    736             0xFFFFFFFD,
    737             0x00000000,
    738         },
    739         []u32{
    740             0x0747AE14,
    741             0xFFFFFFFE,
    742             0x00000000,
    743         },
    744         []u32{
    745             0x0747AE14,
    746             0xFFFFFFFF,
    747             0x00000000,
    748         },
    749         []u32{
    750             0x7FFFFFFF,
    751             0x00000001,
    752             0x7FFFFFFF,
    753         },
    754         []u32{
    755             0x7FFFFFFF,
    756             0x00000002,
    757             0x3FFFFFFF,
    758         },
    759         []u32{
    760             0x7FFFFFFF,
    761             0x00000003,
    762             0x2AAAAAAA,
    763         },
    764         []u32{
    765             0x7FFFFFFF,
    766             0x00000010,
    767             0x07FFFFFF,
    768         },
    769         []u32{
    770             0x7FFFFFFF,
    771             0x078644FA,
    772             0x00000011,
    773         },
    774         []u32{
    775             0x7FFFFFFF,
    776             0x0747AE14,
    777             0x00000011,
    778         },
    779         []u32{
    780             0x7FFFFFFF,
    781             0x7FFFFFFF,
    782             0x00000001,
    783         },
    784         []u32{
    785             0x7FFFFFFF,
    786             0x80000000,
    787             0x00000000,
    788         },
    789         []u32{
    790             0x7FFFFFFF,
    791             0xFFFFFFFD,
    792             0x00000000,
    793         },
    794         []u32{
    795             0x7FFFFFFF,
    796             0xFFFFFFFE,
    797             0x00000000,
    798         },
    799         []u32{
    800             0x7FFFFFFF,
    801             0xFFFFFFFF,
    802             0x00000000,
    803         },
    804         []u32{
    805             0x80000000,
    806             0x00000001,
    807             0x80000000,
    808         },
    809         []u32{
    810             0x80000000,
    811             0x00000002,
    812             0x40000000,
    813         },
    814         []u32{
    815             0x80000000,
    816             0x00000003,
    817             0x2AAAAAAA,
    818         },
    819         []u32{
    820             0x80000000,
    821             0x00000010,
    822             0x08000000,
    823         },
    824         []u32{
    825             0x80000000,
    826             0x078644FA,
    827             0x00000011,
    828         },
    829         []u32{
    830             0x80000000,
    831             0x0747AE14,
    832             0x00000011,
    833         },
    834         []u32{
    835             0x80000000,
    836             0x7FFFFFFF,
    837             0x00000001,
    838         },
    839         []u32{
    840             0x80000000,
    841             0x80000000,
    842             0x00000001,
    843         },
    844         []u32{
    845             0x80000000,
    846             0xFFFFFFFD,
    847             0x00000000,
    848         },
    849         []u32{
    850             0x80000000,
    851             0xFFFFFFFE,
    852             0x00000000,
    853         },
    854         []u32{
    855             0x80000000,
    856             0xFFFFFFFF,
    857             0x00000000,
    858         },
    859         []u32{
    860             0xFFFFFFFD,
    861             0x00000001,
    862             0xFFFFFFFD,
    863         },
    864         []u32{
    865             0xFFFFFFFD,
    866             0x00000002,
    867             0x7FFFFFFE,
    868         },
    869         []u32{
    870             0xFFFFFFFD,
    871             0x00000003,
    872             0x55555554,
    873         },
    874         []u32{
    875             0xFFFFFFFD,
    876             0x00000010,
    877             0x0FFFFFFF,
    878         },
    879         []u32{
    880             0xFFFFFFFD,
    881             0x078644FA,
    882             0x00000022,
    883         },
    884         []u32{
    885             0xFFFFFFFD,
    886             0x0747AE14,
    887             0x00000023,
    888         },
    889         []u32{
    890             0xFFFFFFFD,
    891             0x7FFFFFFF,
    892             0x00000001,
    893         },
    894         []u32{
    895             0xFFFFFFFD,
    896             0x80000000,
    897             0x00000001,
    898         },
    899         []u32{
    900             0xFFFFFFFD,
    901             0xFFFFFFFD,
    902             0x00000001,
    903         },
    904         []u32{
    905             0xFFFFFFFD,
    906             0xFFFFFFFE,
    907             0x00000000,
    908         },
    909         []u32{
    910             0xFFFFFFFD,
    911             0xFFFFFFFF,
    912             0x00000000,
    913         },
    914         []u32{
    915             0xFFFFFFFE,
    916             0x00000001,
    917             0xFFFFFFFE,
    918         },
    919         []u32{
    920             0xFFFFFFFE,
    921             0x00000002,
    922             0x7FFFFFFF,
    923         },
    924         []u32{
    925             0xFFFFFFFE,
    926             0x00000003,
    927             0x55555554,
    928         },
    929         []u32{
    930             0xFFFFFFFE,
    931             0x00000010,
    932             0x0FFFFFFF,
    933         },
    934         []u32{
    935             0xFFFFFFFE,
    936             0x078644FA,
    937             0x00000022,
    938         },
    939         []u32{
    940             0xFFFFFFFE,
    941             0x0747AE14,
    942             0x00000023,
    943         },
    944         []u32{
    945             0xFFFFFFFE,
    946             0x7FFFFFFF,
    947             0x00000002,
    948         },
    949         []u32{
    950             0xFFFFFFFE,
    951             0x80000000,
    952             0x00000001,
    953         },
    954         []u32{
    955             0xFFFFFFFE,
    956             0xFFFFFFFD,
    957             0x00000001,
    958         },
    959         []u32{
    960             0xFFFFFFFE,
    961             0xFFFFFFFE,
    962             0x00000001,
    963         },
    964         []u32{
    965             0xFFFFFFFE,
    966             0xFFFFFFFF,
    967             0x00000000,
    968         },
    969         []u32{
    970             0xFFFFFFFF,
    971             0x00000001,
    972             0xFFFFFFFF,
    973         },
    974         []u32{
    975             0xFFFFFFFF,
    976             0x00000002,
    977             0x7FFFFFFF,
    978         },
    979         []u32{
    980             0xFFFFFFFF,
    981             0x00000003,
    982             0x55555555,
    983         },
    984         []u32{
    985             0xFFFFFFFF,
    986             0x00000010,
    987             0x0FFFFFFF,
    988         },
    989         []u32{
    990             0xFFFFFFFF,
    991             0x078644FA,
    992             0x00000022,
    993         },
    994         []u32{
    995             0xFFFFFFFF,
    996             0x0747AE14,
    997             0x00000023,
    998         },
    999         []u32{
   1000             0xFFFFFFFF,
   1001             0x7FFFFFFF,
   1002             0x00000002,
   1003         },
   1004         []u32{
   1005             0xFFFFFFFF,
   1006             0x80000000,
   1007             0x00000001,
   1008         },
   1009         []u32{
   1010             0xFFFFFFFF,
   1011             0xFFFFFFFD,
   1012             0x00000001,
   1013         },
   1014         []u32{
   1015             0xFFFFFFFF,
   1016             0xFFFFFFFE,
   1017             0x00000001,
   1018         },
   1019         []u32{
   1020             0xFFFFFFFF,
   1021             0xFFFFFFFF,
   1022             0x00000001,
   1023         },
   1024     };
   1025 
   1026     for (cases) |case| {
   1027         test_one_udivsi3(case[0], case[1], case[2]);
   1028     }
   1029 }
   1030 
   1031 fn test_one_udivsi3(a: u32, b: u32, expected_q: u32) void {
   1032     const q: u32 = __udivsi3(a, b);
   1033     assert(q == expected_q);
   1034 }