aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/avxfp-1.c15
-rw-r--r--gcc/testsuite/gcc.target/i386/avxfp-2.c15
5 files changed, 50 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 424404f..dec03cf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2011-09-23 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.c (ix86_prepare_sse_fp_compare_args): For
+ GE/GT/UNLE/UNLT swap arguments and condition even for TARGET_AVX.
+
2011-09-23 Ian Lance Taylor <iant@google.com>
* godump.c (go_define): Treat a single character in single quotes,
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 954b879..291d73f 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -18735,15 +18735,13 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
{
rtx tmp;
- /* AVX supports all the needed comparisons, no need to swap arguments
- nor help reload. */
- if (TARGET_AVX)
- return code;
-
switch (code)
{
case LTGT:
case UNEQ:
+ /* AVX supports all the needed comparisons. */
+ if (TARGET_AVX)
+ break;
/* We have no LTGT as an operator. We could implement it with
NE & ORDERED, but this requires an extra temporary. It's
not clear that it's worth it. */
@@ -18760,6 +18758,9 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
case NE:
case UNORDERED:
case ORDERED:
+ /* AVX has 3 operand comparisons, no need to swap anything. */
+ if (TARGET_AVX)
+ break;
/* For commutative operators, try to canonicalize the destination
operand to be first in the comparison - this helps reload to
avoid extra moves. */
@@ -18771,8 +18772,10 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
case GT:
case UNLE:
case UNLT:
- /* These are not supported directly. Swap the comparison operands
- to transform into something that is supported. */
+ /* These are not supported directly before AVX, and furthermore
+ ix86_expand_sse_fp_minmax only optimizes LT/UNGE. Swap the
+ comparison operands to transform into something that is
+ supported. */
tmp = *pop0;
*pop0 = *pop1;
*pop1 = tmp;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c649043..37f5bec 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-09-23 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.target/i386/avxfp-1.c: New test.
+ * gcc.target/i386/avxfp-2.c: New test.
+
2011-09-23 Terry Guo <terry.guo@arm.com>
* gcc.c-torture/execute/941014-1.x: Deleted.
diff --git a/gcc/testsuite/gcc.target/i386/avxfp-1.c b/gcc/testsuite/gcc.target/i386/avxfp-1.c
new file mode 100644
index 0000000..70bc8f1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avxfp-1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx -mfpmath=sse" } */
+/* { dg-final { scan-assembler "vmaxsd" } } */
+/* { dg-final { scan-assembler "vminsd" } } */
+double x;
+t()
+{
+ x=x>5?x:5;
+}
+
+double x;
+q()
+{
+ x=x<5?x:5;
+}
diff --git a/gcc/testsuite/gcc.target/i386/avxfp-2.c b/gcc/testsuite/gcc.target/i386/avxfp-2.c
new file mode 100644
index 0000000..c34a1bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avxfp-2.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx -mfpmath=sse" } */
+/* { dg-final { scan-assembler "vmaxsd" } } */
+/* { dg-final { scan-assembler "vminsd" } } */
+double x;
+q()
+{
+ x=x<5?5:x;
+}
+
+double x;
+q1()
+{
+ x=x>5?5:x;
+}