[PATCH, i386]: Fix PR 63947, Wrong fcmov suffix

Uros Bizjak ubizjak@gmail.com
Wed Nov 19 20:55:00 GMT 2014


Hello!

Carry flag checks from overflow tests can propagate into FP cmove
instructions. However, while "c" and "nc" suffixes are allowed as
suffixes in integer cmove insns, they are not allowed in FP cmove
insns. Patch generates equivalent "b" and "nb" suffixes for FP mode.

2014-11-19  Uros Bizjak  <ubizjak@gmail.com>

    PR target/63947
    * config/i386/i386.c (put_condition_code) <case LTU, case GEU>:
    Output "b" and "nb" suffix for FP mode.

testsuite/ChangeLog:

2014-11-19  Uros Bizjak  <ubizjak@gmail.com>

    PR target/63947
    * gcc.target/i386/pr63947.c: New test.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Patch was committed to mainline SVN and will be backported to all
active branches.

Uros.
-------------- next part --------------
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 217789)
+++ config/i386/i386.c	(working copy)
@@ -14953,7 +14953,7 @@ put_condition_code (enum rtx_code code, machine_mo
       if (mode == CCmode)
 	suffix = "b";
       else if (mode == CCCmode)
-	suffix = "c";
+	suffix = fp ? "b" : "c";
       else
 	gcc_unreachable ();
       break;
@@ -14976,9 +14976,9 @@ put_condition_code (enum rtx_code code, machine_mo
       break;
     case GEU:
       if (mode == CCmode)
-	suffix = fp ? "nb" : "ae";
+	suffix = "nb";
       else if (mode == CCCmode)
-	suffix = "nc";
+	suffix = fp ? "nb" : "nc";
       else
 	gcc_unreachable ();
       break;
Index: testsuite/gcc.target/i386/pr63947.c
===================================================================
--- testsuite/gcc.target/i386/pr63947.c	(revision 0)
+++ testsuite/gcc.target/i386/pr63947.c	(working copy)
@@ -0,0 +1,9 @@
+/* PR target/63947 */
+/* { dg-do assemble } */
+/* { dg-options "-Os" } */
+/* { dg-additional-options "-march=i686" { target ia32 } } */
+
+long double foo (unsigned a, unsigned b)
+{
+  return a + b < a;
+}


More information about the Gcc-patches mailing list