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 }