aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2020-02-16 21:38:39 +0100
committerUros Bizjak <ubizjak@gmail.com>2020-02-16 21:38:39 +0100
commit6e37e49616d429c5d922324ebd72ae95f12a079f (patch)
treeba4aaaa3795396fdfd82099a91c0ace4b7926a73
parent72700543b67561ab6a466e93b4c0d4fa8e6530e6 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr93743.c30
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;
+}