| /* { dg-do run } */ |
| /* { dg-options "-O2 -fno-inline" } */ |
| |
| extern void abort (void); |
| |
| #define force_simd_si(v) asm volatile ("mov %s0, %1.s[0]" :"=w" (v) :"w" (v) :) |
| |
| unsigned int |
| shft_add (unsigned int a, unsigned int b) |
| { |
| unsigned int c; |
| |
| force_simd_si (a); |
| force_simd_si (b); |
| c = a >> b; |
| force_simd_si (c); |
| |
| return c + b; |
| } |
| |
| int |
| main (void) |
| { |
| unsigned int i = 0; |
| unsigned int a = 0xdeadbeef; |
| |
| for (i = 0; i < 32; i++) |
| { |
| unsigned int exp = (a / (1 << i) + i); |
| unsigned int got = shft_add (a, i); |
| |
| if (exp != got) |
| abort (); |
| } |
| |
| return 0; |
| } |
| |