FSF GCC merge 02/23/03
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / arith-rand-ll.c
blobd5791ec330383720a34b59f130be615e15839544
1 long long
2 simple_rand ()
4 static unsigned long long seed = 47114711;
5 unsigned long long this = seed * 1103515245 + 12345;
6 seed = this;
7 return this >> 8;
10 unsigned long long int
11 random_bitstring ()
13 unsigned long long int x;
14 int n_bits;
15 long long ran;
16 int tot_bits = 0;
18 x = 0;
19 for (;;)
21 ran = simple_rand ();
22 n_bits = (ran >> 1) % 16;
23 tot_bits += n_bits;
25 if (n_bits == 0)
26 return x;
27 else
29 x <<= n_bits;
30 if (ran & 1)
31 x |= (1 << n_bits) - 1;
33 if (tot_bits > 8 * sizeof (long long) + 6)
34 return x;
39 #define ABS(x) ((x) >= 0 ? (x) : -(x))
41 main ()
43 long long int i;
45 for (i = 0; i < 10000; i++)
47 unsigned long long x, y;
48 x = random_bitstring ();
49 y = random_bitstring ();
51 if (sizeof (int) == sizeof (long long))
52 goto save_time;
54 { unsigned long long xx = x, yy = y, r1, r2;
55 if (yy == 0) continue;
56 r1 = xx / yy;
57 r2 = xx % yy;
58 if (r2 >= yy || r1 * yy + r2 != xx)
59 abort ();
61 { signed long long xx = x, yy = y, r1, r2;
62 if ((unsigned long long) xx << 1 == 0 && yy == -1)
63 continue;
64 r1 = xx / yy;
65 r2 = xx % yy;
66 if (ABS (r2) >= (unsigned long long) ABS (yy) || (signed long long) (r1 * yy + r2) != xx)
67 abort ();
69 save_time:
70 { unsigned int xx = x, yy = y, r1, r2;
71 if (yy == 0) continue;
72 r1 = xx / yy;
73 r2 = xx % yy;
74 if (r2 >= yy || r1 * yy + r2 != xx)
75 abort ();
77 { signed int xx = x, yy = y, r1, r2;
78 if ((unsigned int) xx << 1 == 0 && yy == -1)
79 continue;
80 r1 = xx / yy;
81 r2 = xx % yy;
82 if (ABS (r2) >= (unsigned int) ABS (yy) || (signed int) (r1 * yy + r2) != xx)
83 abort ();
85 { unsigned short xx = x, yy = y, r1, r2;
86 if (yy == 0) continue;
87 r1 = xx / yy;
88 r2 = xx % yy;
89 if (r2 >= yy || r1 * yy + r2 != xx)
90 abort ();
92 { signed short xx = x, yy = y, r1, r2;
93 r1 = xx / yy;
94 r2 = xx % yy;
95 if (ABS (r2) >= (unsigned short) ABS (yy) || (signed short) (r1 * yy + r2) != xx)
96 abort ();
98 { unsigned char xx = x, yy = y, r1, r2;
99 if (yy == 0) continue;
100 r1 = xx / yy;
101 r2 = xx % yy;
102 if (r2 >= yy || r1 * yy + r2 != xx)
103 abort ();
105 { signed char xx = x, yy = y, r1, r2;
106 r1 = xx / yy;
107 r2 = xx % yy;
108 if (ABS (r2) >= (unsigned char) ABS (yy) || (signed char) (r1 * yy + r2) != xx)
109 abort ();
113 exit (0);