| long long |
| xlrandom () |
| { |
| long long x; |
| unsigned a; |
| int bits = 64; |
| unsigned b; |
| |
| do |
| { |
| a = random (); |
| b = (a & 15) + 1; |
| x <<= b; /* shift up 1-16 steps */ |
| a = (a >> 18) & 1; |
| if (a) |
| x |= (unsigned) (1 << b) - 1; |
| bits -= b; |
| } |
| while (bits >= 0); |
| return x; |
| } |
| |
| |
| unsigned long long __udivmoddi4(); |
| |
| main () |
| { |
| int i; |
| unsigned long long n, d, q, r, rr; |
| |
| for (i = 0; ;i++) |
| { |
| n = xlrandom (); |
| d = xlrandom (); |
| if (d == 0) |
| continue; |
| |
| q = __udivmoddi4 (n, d, &r); |
| |
| if (i % 1000000 == 0) |
| printf ("Testing udivmoddi4: %d iterations made\n", i); |
| |
| rr = n - q * d; |
| if (rr != r || r >= d) |
| { |
| printf ("Testing udivmoddi4: failure after %d iterations\n", i); |
| printf ("n=%lX%08lX\n", (unsigned) (n >> 32), (unsigned) n); |
| printf ("d=%lX%08lX\n", (unsigned) (d >> 32), (unsigned) d); |
| printf ("q=%lX%08lX\n", (unsigned) (q >> 32), (unsigned) q); |
| printf ("r=%lX%08lX\n", (unsigned) (r >> 32), (unsigned) r); |
| printf ("rr=%lX%08lX\n", (unsigned) (rr >> 32), (unsigned) rr); |
| abort (); |
| } |
| } |
| |
| } |