| /* { dg-do run { target ia64-*-linux* } } */ |
| /* { dg-options "-O3" } */ |
| |
| extern void abort (void); |
| extern void exit (int); |
| |
| int __attribute__((noinline, const)) |
| ret4 (float value) |
| { |
| return 4; |
| } |
| |
| int __attribute__((noinline, const)) |
| ret0 (float value) |
| { |
| return 0; |
| } |
| |
| float __attribute__((noinline)) |
| test (float x, float y) |
| { |
| int clsx = ret4 (x); |
| int clsy = ret0 (y); |
| |
| if (clsx == 0 || clsy == 0 |
| || (y < 0 && clsx == 1 && clsy == 1)) |
| return x - y; |
| |
| return x < y ? 0 : x - y; |
| } |
| |
| float a = 0.0, b; |
| |
| int main (void) |
| { |
| unsigned long e; |
| b = a / a; |
| __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (e)); |
| e &= ~0x7e000UL; |
| __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (e) : "memory"); |
| a = test (0, b); |
| __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (e)); |
| if (e & 0x2000) |
| abort (); |
| exit (0); |
| } |