1long long 2xlrandom () 3{ 4 long long x; 5 unsigned a; 6 int bits = 64; 7 unsigned b; 8 9 do 10 { 11 a = random (); 12 b = (a & 15) + 1; 13 x <<= b; /* shift up 1-16 steps */ 14 a = (a >> 18) & 1; 15 if (a) 16 x |= (unsigned) (1 << b) - 1; 17 bits -= b; 18 } 19 while (bits >= 0); 20 return x; 21} 22 23 24unsigned long long __udivmoddi4(); 25 26main () 27{ 28 int i; 29 unsigned long long n, d, q, r, rr; 30 31 for (i = 0; ;i++) 32 { 33 n = xlrandom (); 34 d = xlrandom (); 35 if (d == 0) 36 continue; 37 38 q = __udivmoddi4 (n, d, &r); 39 40 if (i % 1000000 == 0) 41 printf ("Testing udivmoddi4: %d iterations made\n", i); 42 43 rr = n - q * d; 44 if (rr != r || r >= d) 45 { 46 printf ("Testing udivmoddi4: failure after %d iterations\n", i); 47 printf ("n=%lX%08lX\n", (unsigned) (n >> 32), (unsigned) n); 48 printf ("d=%lX%08lX\n", (unsigned) (d >> 32), (unsigned) d); 49 printf ("q=%lX%08lX\n", (unsigned) (q >> 32), (unsigned) q); 50 printf ("r=%lX%08lX\n", (unsigned) (r >> 32), (unsigned) r); 51 printf ("rr=%lX%08lX\n", (unsigned) (rr >> 32), (unsigned) rr); 52 abort (); 53 } 54 } 55 56} 57