diff options
-rw-r--r-- | gcc/config/i386/i386.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr102498.c | 59 |
2 files changed, 61 insertions, 1 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b3e4add..5aeb44c 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5039,7 +5039,8 @@ standard_80387_constant_p (rtx x) /* For XFmode constants, try to find a special 80387 instruction when optimizing for size or on those CPUs that benefit from them. */ if (mode == XFmode - && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS)) + && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS) + && !flag_rounding_math) { int i; diff --git a/gcc/testsuite/gcc.target/i386/pr102498.c b/gcc/testsuite/gcc.target/i386/pr102498.c new file mode 100644 index 0000000..44161c5 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr102498.c @@ -0,0 +1,59 @@ +/* PR target/102498 */ +/* { dg-do run { target fenv } } */ +/* { dg-options "-frounding-math" } */ + +#include <fenv.h> +#include <stdlib.h> + +__attribute__((noipa)) long double +fldlg2 (void) +{ + return 0.3010299956639811952256464283594894482L; +} + +__attribute__((noipa)) long double +fldln2 (void) +{ + return 0.6931471805599453094286904741849753009L; +} + +__attribute__((noipa)) long double +fldl2e (void) +{ + return 1.4426950408889634073876517827983434472L; +} + +__attribute__((noipa)) long double +fldl2t (void) +{ + return 3.3219280948873623478083405569094566090L; +} + +__attribute__((noipa)) long double +fldpi (void) +{ + return 3.1415926535897932385128089594061862044L; +} + +int +main () +{ + long double a = fldlg2 (); + long double b = fldln2 (); + long double c = fldl2e (); + long double d = fldl2t (); + long double e = fldpi (); + static int f[] = { FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD }; + int i; + for (i = 0; i < 4; i++) + { + fesetround (f[i]); + if (a != fldlg2 () + || b != fldln2 () + || c != fldl2e () + || d != fldl2t () + || e != fldpi ()) + abort (); + } + return 0; +} |