Commit 50926346 by Jakub Jelinek Committed by Jakub Jelinek

i386.c (ix86_prepare_sse_fp_compare_args): For GE/GT/UNLE/UNLT swap arguments…

i386.c (ix86_prepare_sse_fp_compare_args): For GE/GT/UNLE/UNLT swap arguments and condition even for TARGET_AVX.

	* config/i386/i386.c (ix86_prepare_sse_fp_compare_args): For
	GE/GT/UNLE/UNLT swap arguments and condition even for TARGET_AVX.

	* gcc.target/i386/avxfp-1.c: New test.
	* gcc.target/i386/avxfp-2.c: New test.

From-SVN: r179119
parent 9e4ef69e
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> 2011-09-23 Ian Lance Taylor <iant@google.com>
* godump.c (go_define): Treat a single character in single quotes, * godump.c (go_define): Treat a single character in single quotes,
...@@ -18735,15 +18735,13 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code, ...@@ -18735,15 +18735,13 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
{ {
rtx tmp; rtx tmp;
/* AVX supports all the needed comparisons, no need to swap arguments
nor help reload. */
if (TARGET_AVX)
return code;
switch (code) switch (code)
{ {
case LTGT: case LTGT:
case UNEQ: case UNEQ:
/* AVX supports all the needed comparisons. */
if (TARGET_AVX)
break;
/* We have no LTGT as an operator. We could implement it with /* We have no LTGT as an operator. We could implement it with
NE & ORDERED, but this requires an extra temporary. It's NE & ORDERED, but this requires an extra temporary. It's
not clear that it's worth it. */ not clear that it's worth it. */
...@@ -18760,6 +18758,9 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code, ...@@ -18760,6 +18758,9 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
case NE: case NE:
case UNORDERED: case UNORDERED:
case ORDERED: case ORDERED:
/* AVX has 3 operand comparisons, no need to swap anything. */
if (TARGET_AVX)
break;
/* For commutative operators, try to canonicalize the destination /* For commutative operators, try to canonicalize the destination
operand to be first in the comparison - this helps reload to operand to be first in the comparison - this helps reload to
avoid extra moves. */ avoid extra moves. */
...@@ -18771,8 +18772,10 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code, ...@@ -18771,8 +18772,10 @@ ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
case GT: case GT:
case UNLE: case UNLE:
case UNLT: case UNLT:
/* These are not supported directly. Swap the comparison operands /* These are not supported directly before AVX, and furthermore
to transform into something that is supported. */ ix86_expand_sse_fp_minmax only optimizes LT/UNGE. Swap the
comparison operands to transform into something that is
supported. */
tmp = *pop0; tmp = *pop0;
*pop0 = *pop1; *pop0 = *pop1;
*pop1 = tmp; *pop1 = tmp;
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> 2011-09-23 Terry Guo <terry.guo@arm.com>
* gcc.c-torture/execute/941014-1.x: Deleted. * gcc.c-torture/execute/941014-1.x: Deleted.
......
/* { 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;
}
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment