diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2020-02-16 21:38:39 +0100 |
---|---|---|
committer | Uros Bizjak <ubizjak@gmail.com> | 2020-02-16 21:38:39 +0100 |
commit | 6e37e49616d429c5d922324ebd72ae95f12a079f (patch) | |
tree | ba4aaaa3795396fdfd82099a91c0ace4b7926a73 | |
parent | 72700543b67561ab6a466e93b4c0d4fa8e6530e6 (diff) | |
download | gcc-6e37e49616d429c5d922324ebd72ae95f12a079f.zip gcc-6e37e49616d429c5d922324ebd72ae95f12a079f.tar.gz gcc-6e37e49616d429c5d922324ebd72ae95f12a079f.tar.bz2 |
i386: Fix atan2l argument order [PR93743]
PR target/93743
* config/i386/i386.md (atan2xf3): Swap operands 1 and 2.
(atan2<mode>3): Update operand order in the call to gen_atan2xf3.
testsuite/ChangeLog:
PR target/93743
* gcc.target/i386/pr93743.c : New test.
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr93743.c | 30 |
4 files changed, 45 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6283e80..c7a551b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-02-16 Uroš Bizjak <ubizjak@gmail.com> + + PR target/93743 + * config/i386/i386.md (atan2xf3): Swap operands 1 and 2. + (atan2<mode>3): Update operand order in the call to gen_atan2xf3. + 2020-02-15 Jason Merrill <jason@redhat.com> * doc/invoke.texi (C Dialect Options): Add -std=c++20. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index f14683c..6c57500 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -15999,10 +15999,10 @@ (define_insn "atan2xf3" [(set (match_operand:XF 0 "register_operand" "=f") - (unspec:XF [(match_operand:XF 1 "register_operand" "0") - (match_operand:XF 2 "register_operand" "f")] + (unspec:XF [(match_operand:XF 2 "register_operand" "0") + (match_operand:XF 1 "register_operand" "f")] UNSPEC_FPATAN)) - (clobber (match_scratch:XF 3 "=2"))] + (clobber (match_scratch:XF 3 "=1"))] "TARGET_USE_FANCY_MATH_387 && flag_unsafe_math_optimizations" "fpatan" @@ -16026,7 +16026,7 @@ emit_insn (gen_extend<mode>xf2 (op2, operands[2])); emit_insn (gen_extend<mode>xf2 (op1, operands[1])); - emit_insn (gen_atan2xf3 (op0, op2, op1)); + emit_insn (gen_atan2xf3 (op0, op1, op2)); emit_insn (gen_truncxf<mode>2 (operands[0], op0)); DONE; }) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7c198dc..f2566ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-02-16 Uroš Bizjak <ubizjak@gmail.com> + + PR target/93743 + * gcc.target/i386/pr93743.c : New test. + 2020-02-15 Marek Polacek <polacek@redhat.com> PR c++/93710 - poor diagnostic for array initializer. diff --git a/gcc/testsuite/gcc.target/i386/pr93743.c b/gcc/testsuite/gcc.target/i386/pr93743.c new file mode 100644 index 0000000..c0e9d2c --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr93743.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -ffast-math -mfpmath=387" } */ + +void +__attribute__((noinline)) +test (long double x, long double y) +{ + long double ldbl_n = __builtin_atan2l (x, y); + long double ldbl_s = __builtin_atan2l (y, x); // arguments swapped + + if (ldbl_n < 1.L || 1.L < ldbl_s) + __builtin_abort (); + + double dbl_n = __builtin_atan2 (x, y); + double dbl_s = __builtin_atan2 (y, x); // arguments swapped + + if (dbl_n < 1. || 1. < dbl_s) + __builtin_abort (); +} + +int +main () +{ + long double x = 0.922766L; + long double y = 0.080466L; + + test (x, y); + + return 0; +} |