blob: 8d80ae6b4aa9a9adb5b34af385fd56f0ac554960 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O2 -march=v10" } */
/* { dg-final { scan-assembler-times {\tnop} 1 } } */
/* A somewhat brittle test-case, checking that we have (only) one
unfilled delay-slot in random_bitstring: there might be none or two
or more, and general improvements may lead to unfilled delay-slots.
When the scan-assembler-times directive regresses, re-run
gcc.c-torture/execute/arith-rand-ll.c, check cycle-level
execution-time regressions in random_bitstring and take appropriate
action. */
static long long
simple_rand ()
{
static unsigned long long seed = 47114711;
unsigned long long this = seed * 1103515245 + 12345;
seed = this;
return this >> 8;
}
unsigned long long int
random_bitstring ()
{
unsigned long long int x;
int n_bits;
long long ran;
int tot_bits = 0;
x = 0;
for (;;)
{
ran = simple_rand ();
n_bits = (ran >> 1) % 16;
tot_bits += n_bits;
if (n_bits == 0)
return x;
else
{
x <<= n_bits;
if (ran & 1)
x |= (1 << n_bits) - 1;
if (tot_bits > 8 * sizeof (long long) + 6)
return x;
}
}
}