Hello!

x86_64 ABI mandates long double returns in x87 register, so it is
invalid to use --mno-fp-ret-in-387. It just happened that vzeroupper
insertion mode-switching pass tripped on invalid register usage.

2013-06-20  Uros Bizjak  <ubiz...@gmail.com>

    PR target/57655
    * config/i386/i386.c (construct_container): Report error if
    long double is used with disabled x87 float returns.

testsuite/ChangeLog:

2013-06-20  Uros Bizjak  <ubiz...@gmail.com>

    PR target/57655
    * gcc.target/i386/pr57655.c: New test.

Patch was tested on x86_64-pc-linux-gnu {,-m32} and was committed to
mainline SVN. The patch will be backported to all release branches.

Uros.
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c  (revision 200247)
+++ config/i386/i386.c  (working copy)
@@ -6498,7 +6498,7 @@ construct_container (enum machine_mode mode, enum
 
   /* Likewise, error if the ABI requires us to return values in the
      x87 registers and the user specified -mno-80387.  */
-  if (!TARGET_80387 && in_return)
+  if (!TARGET_FLOAT_RETURNS_IN_80387 && in_return)
     for (i = 0; i < n; i++)
       if (regclass[i] == X86_64_X87_CLASS
          || regclass[i] == X86_64_X87UP_CLASS
Index: testsuite/gcc.target/i386/pr57655.c
===================================================================
--- testsuite/gcc.target/i386/pr57655.c (revision 0)
+++ testsuite/gcc.target/i386/pr57655.c (working copy)
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx -mvzeroupper -mno-fp-ret-in-387" }
+
+/* { dg-error "x87 register return with x87 disabled" "" { target { ! ia32 } } 
8 } */
+
+long double
+foo (long double x)
+{
+  return __builtin_ilogbl (x);
+}

Reply via email to