From ef1e3836710e20fb399a72bda0bde0ba7a616078 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sun, 22 Oct 2017 21:04:36 +0200 Subject: [PATCH] re PR target/52451 (gcc w/i387 float generates fucom rather than fcom for floating point comparsons) PR target/52451 * config/i386/i386.c (ix86_fp_compare_mode): Return CCFPmode for ordered inequality comparisons even with TARGET_IEEE_FP. testsuite/ChangeLog: PR target/52451 * gcc.dg/torture/pr52451.c: New test. From-SVN: r253986 --- gcc/ChangeLog | 13 ++++++ gcc/config/i386/i386.c | 37 +++++++++++++---- gcc/testsuite/ChangeLog | 8 +++- gcc/testsuite/gcc.dg/torture/pr52451.c | 55 ++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr52451.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3ada30edc3d..78cd3cea361 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2017-10-22 Uros Bizjak + + PR target/52451 + * config/i386/i386.c (ix86_fp_compare_mode): Return CCFPmode + for ordered inequality comparisons even with TARGET_IEEE_FP. + +2017-10-22 Uros Bizjak + + PR target/82628 + * config/i386/i386.md (cmp_doubleword): New pattern. + * config/i386/i386.c (ix86_expand_branch) : + Expand with cmp_doubleword. + 2017-10-21 Igor Tsimbalist * extend.texi: Add x86 specific to 'nocf_check' attribute. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 5abd4d8ab25..ff0f6f89f91 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -21682,14 +21682,35 @@ ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1) Return the appropriate mode to use. */ machine_mode -ix86_fp_compare_mode (enum rtx_code) -{ - /* ??? In order to make all comparisons reversible, we do all comparisons - non-trapping when compiling for IEEE. Once gcc is able to distinguish - all forms trapping and nontrapping comparisons, we can make inequality - comparisons trapping again, since it results in better code when using - FCOM based compares. */ - return TARGET_IEEE_FP ? CCFPUmode : CCFPmode; +ix86_fp_compare_mode (enum rtx_code code) +{ + if (!TARGET_IEEE_FP) + return CCFPmode; + + switch (code) + { + case GT: + case GE: + case LT: + case LE: + return CCFPmode; + + case EQ: + case NE: + + case LTGT: + case UNORDERED: + case ORDERED: + case UNLT: + case UNLE: + case UNGT: + case UNGE: + case UNEQ: + return CCFPUmode; + + default: + gcc_unreachable (); + } } machine_mode diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 493b361c8bf..f14930b6e11 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-10-22 Uros Bizjak + + PR target/52451 + * gcc.dg/torture/pr52451.c: New test. + 2017-10-22 Uros Bizjak Jakub Jelinek @@ -53,8 +58,7 @@ * gcc.target/i386/cet-sjlj-3.c: Likewise. * gcc.target/i386/cet-switch-1.c: Likewise. * gcc.target/i386/cet-switch-2.c: Likewise. - * lib/target-supports.exp (check_effective_target_cet): New - proc. + * lib/target-supports.exp (check_effective_target_cet): New proc. 2017-10-20 Jan Hubicka diff --git a/gcc/testsuite/gcc.dg/torture/pr52451.c b/gcc/testsuite/gcc.dg/torture/pr52451.c new file mode 100644 index 00000000000..81a3d4d158d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr52451.c @@ -0,0 +1,55 @@ +/* { dg-do run } */ +/* { dg-add-options ieee } */ +/* { dg-require-effective-target fenv_exceptions } */ + +#include + +#define TEST_C_NOEX(CMP, S) \ + r = nan##S CMP arg##S; \ + if (fetestexcept (FE_INVALID)) \ + __builtin_abort () + +#define TEST_B_NOEX(FN, S) \ + r = __builtin_##FN (nan##S, arg##S); \ + if (fetestexcept (FE_INVALID)) \ + __builtin_abort () + +#define TEST_C_EX(CMP, S) \ + r = nan##S CMP arg##S; \ + if (!fetestexcept (FE_INVALID)) \ + __builtin_abort (); \ + feclearexcept (FE_INVALID) + +#define TEST(TYPE, S) \ + volatile TYPE nan##S = __builtin_nan##S (""); \ + volatile TYPE arg##S = 1.0##S; \ + \ + TEST_C_NOEX (==, S); \ + TEST_C_NOEX (!=, S); \ + \ + TEST_B_NOEX (isgreater, S); \ + TEST_B_NOEX (isless, S); \ + TEST_B_NOEX (isgreaterequal, S); \ + TEST_B_NOEX (islessequal, S); \ + \ + TEST_B_NOEX (islessgreater, S); \ + TEST_B_NOEX (isunordered, S); \ + \ + TEST_C_EX (>, S); \ + TEST_C_EX (<, S); \ + TEST_C_EX (>=, S); \ + TEST_C_EX (<=, S) + +int +main (void) +{ + volatile int r; + + feclearexcept (FE_INVALID); + + TEST (float, f); + TEST (double, ); + TEST (long double, l); + + return 0; +} -- 2.30.2