(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
arith-rand-ll.c
       1  long long
       2  simple_rand ()
       3  {
       4    static unsigned long long seed = 47114711;
       5    unsigned long long this = seed * 1103515245 + 12345;
       6    seed = this;
       7    return this >> 8;
       8  }
       9  
      10  unsigned long long int
      11  random_bitstring ()
      12  {
      13    unsigned long long int x;
      14    int n_bits;
      15    long 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 long) + 6)
      34  	    return x;
      35  	}
      36      }
      37  }
      38  
      39  #define ABS(x) ((x) >= 0 ? (x) : -(x))
      40  
      41  main ()
      42  {
      43    long long int i;
      44  
      45    for (i = 0; i < 10000; i++)
      46      {
      47        unsigned long long x, y;
      48        x = random_bitstring ();
      49        y = random_bitstring ();
      50  
      51        if (sizeof (int) == sizeof (long long))
      52  	goto save_time;
      53  
      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 ();
      60        }
      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 ();
      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 || ((xx < 0) != (r2 < 0) && r2))
      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  }