| /* { 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; |
| } |
| } |
| } |