modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/arith-rand.c (about)

     1  long
     2  simple_rand ()
     3  {
     4    static unsigned long seed = 47114711;
     5    unsigned long this = seed * 1103515245 + 12345;
     6    seed = this;
     7    return this >> 8;
     8  }
     9  
    10  unsigned long int
    11  random_bitstring ()
    12  {
    13    unsigned long int x;
    14    int n_bits;
    15    long ran;
    16    int tot_bits = 0;
    17  
    18    x = 0;
    19    for (;;)
    20      {
    21        ran = simple_rand ();
    22        n_bits = (ran >> 1) % 16;
    23        tot_bits += n_bits;
    24  
    25        if (n_bits == 0)
    26  	return x;
    27        else
    28  	{
    29  	  x <<= n_bits;
    30  	  if (ran & 1)
    31  	    x |= (1 << n_bits) - 1;
    32  
    33  	  if (tot_bits > 8 * sizeof (long) + 6)
    34  	    return x;
    35  	}
    36      }
    37  }
    38  
    39  #define ABS(x) ((x) >= 0 ? (x) : -(x))
    40  
    41  main ()
    42  {
    43    long int i;
    44  
    45    for (i = 0; i < 1000; i++)
    46      {
    47        unsigned long x, y;
    48        x = random_bitstring ();
    49        y = random_bitstring ();
    50  
    51        if (sizeof (int) == sizeof (long))
    52  	goto save_time;
    53  
    54        { unsigned 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 ();
    60        }
    61        { signed long xx = x, yy = y, r1, r2;
    62  	if ((unsigned long) xx << 1 == 0 && yy == -1)
    63  	  continue;
    64  	r1 = xx / yy;
    65  	r2 = xx % yy;
    66  	if (ABS (r2) >= (unsigned long) ABS (yy) || (signed long) (r1 * yy + r2) != xx)
    67  	  abort ();
    68        }
    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 ();
    76        }
    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 ();
    84        }
    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 ();
    91        }
    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 ();
    97        }
    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 ();
   104        }
   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 ();
   110        }
   111      }
   112  
   113    exit (0);
   114  }