| /* PR target/81906 */ |
| /* { dg-do run { target *-*-linux* *-*-gnu* } } |
| /* { dg-options "-O2 -frounding-math" } */ |
| |
| #include <fenv.h> |
| |
| int |
| main () |
| { |
| #define N 12 |
| double a[N] = { 2.0, 2.25, 2.5, 2.75, 3.5, -2.0, -2.25, -2.5, -2.75, -3.5, 0x2.0p53, -0x2.0p53 }; |
| double b[N], c[N], d[N], e[N]; |
| double be[N] = { 2.0, 2.0, 2.0, 3.0, 4.0, -2.0, -2.0, -2.0, -3.0, -4.0, 0x2.0p53, -0x2.0p53 }; |
| double ce[N] = { 2.0, 2.0, 2.0, 2.0, 3.0, -2.0, -3.0, -3.0, -3.0, -4.0, 0x2.0p53, -0x2.0p53 }; |
| double de[N] = { 2.0, 3.0, 3.0, 3.0, 4.0, -2.0, -2.0, -2.0, -2.0, -3.0, 0x2.0p53, -0x2.0p53 }; |
| double ee[N] = { 2.0, 2.0, 2.0, 2.0, 3.0, -2.0, -2.0, -2.0, -2.0, -3.0, 0x2.0p53, -0x2.0p53 }; |
| asm volatile ("" : : "g" (a), "g" (be), "g" (ce), "g" (de), "g" (ee) : "memory"); |
| |
| int i; |
| fesetround (FE_TONEAREST); |
| for (i = 0; i < N; ++i) |
| b[i] = __builtin_rint (a[i]); |
| fesetround (FE_DOWNWARD); |
| for (i = 0; i < N; ++i) |
| c[i] = __builtin_rint (a[i]); |
| fesetround (FE_UPWARD); |
| for (i = 0; i < N; ++i) |
| d[i] = __builtin_rint (a[i]); |
| fesetround (FE_TOWARDZERO); |
| for (i = 0; i < N; ++i) |
| e[i] = __builtin_rint (a[i]); |
| fesetround (FE_TONEAREST); |
| for (i = 0; i < N; ++i) |
| if (b[i] != be[i] || c[i] != ce[i] || d[i] != de[i] || e[i] != ee[i]) |
| __builtin_abort (); |
| return 0; |
| } |