]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/26223 (ICE on long double with -mno-80387)
authorRoger Sayle <roger@eyesopen.com>
Tue, 6 Jun 2006 19:43:17 +0000 (19:43 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Tue, 6 Jun 2006 19:43:17 +0000 (19:43 +0000)
PR target/26223
* config/i386/i386.c (construct_container): Split static issued_error
flag into issued_sse_arg_error, issued_sse_ret_error and
issued_x87_ret_error.  Issue a daignostic if the x86-64 ABI
requires the use of x87 registers and the user explicitly
specified the -mno-80387 command line option.

* gcc.target/i386/amd64-abi-2.c: New test case.

From-SVN: r114446

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/amd64-abi-2.c [new file with mode: 0644]

index 3103db36e7710bf8ab753e881a8ab490a90335df..d1fdb162280d2004c47135b10d67653156d77f2b 100644 (file)
@@ -1,3 +1,12 @@
+2006-06-06  Roger Sayle  <roger@eyesopen.com>
+
+       PR target/26223
+       * config/i386/i386.c (construct_container): Split static issued_error
+       flag into issued_sse_arg_error, issued_sse_ret_error and
+       issued_x87_ret_error.  Issue a daignostic if the x86-64 ABI
+       requires the use of x87 registers and the user explicitly
+       specified the -mno-80387 command line option.
+
 2006-06-05  Joseph S. Myers  <joseph@codesourcery.com>
 
        PR c/25161
index f9b0bde59a5015092c5cd95b7d580dc0b8744c62..209e8363b9b5181e42fffb5e9ab6f6fa84ef5857 100644 (file)
@@ -2539,6 +2539,11 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
                     tree type, int in_return, int nintregs, int nsseregs,
                     const int *intreg, int sse_regno)
 {
+  /* The following variables hold the static issued_error state.  */
+  static bool issued_sse_arg_error;
+  static bool issued_sse_ret_error;
+  static bool issued_x87_ret_error;
+
   enum machine_mode tmpmode;
   int bytes =
     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
@@ -2577,18 +2582,38 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
      some less clueful developer tries to use floating-point anyway.  */
   if (needed_sseregs && !TARGET_SSE)
     {
-      static bool issued_error;
-      if (!issued_error)
+      if (in_return)
        {
-         issued_error = true;
-         if (in_return)
-           error ("SSE register return with SSE disabled");
-         else
-           error ("SSE register argument with SSE disabled");
+         if (!issued_sse_ret_error)
+           {
+             error ("SSE register return with SSE disabled");
+             issued_sse_ret_error = true;
+           }
+       }
+      else if (!issued_sse_arg_error)
+       {
+         error ("SSE register argument with SSE disabled");
+         issued_sse_arg_error = true;
        }
       return NULL;
     }
 
+  /* 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)
+    for (i = 0; i < n; i++)
+      if (class[i] == X86_64_X87_CLASS
+         || class[i] == X86_64_X87UP_CLASS
+         || class[i] == X86_64_COMPLEX_X87_CLASS)
+       {
+         if (!issued_x87_ret_error)
+           {
+             error ("x87 register return with x87 disabled");
+             issued_x87_ret_error = true;
+           }
+         return NULL;
+       }
+
   /* First construct simple cases.  Avoid SCmode, since we want to use
      single register to pass this type.  */
   if (n == 1 && mode != SCmode)
index 20f8e6761caacc604c6d34d265fb49d8838147cf..b65d909a810ac23357d1d8cad4d73a79bd2ba83a 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-06  Roger Sayle  <roger@eyesopen.com>
+
+       PR target/26223
+       * gcc.target/i386/amd64-abi-2.c: New test case.
+
 2006-06-05  Steve Ellcey  <sje@cup.hp.com>
 
        Backport from mainline:
diff --git a/gcc/testsuite/gcc.target/i386/amd64-abi-2.c b/gcc/testsuite/gcc.target/i386/amd64-abi-2.c
new file mode 100644 (file)
index 0000000..2ff642d
--- /dev/null
@@ -0,0 +1,6 @@
+/* PR target/26223 */
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
+/* { dg-options "-mno-80387" } */
+long double foo(long double x) { return x; } /* { dg-error "x87 disabled" } */
+long double bar(long double x) { return x; }
+