re PR target/26223 (ICE on long double with -mno-80387)
authorRoger Sayle <roger@eyesopen.com>
Sun, 4 Jun 2006 04:28:25 +0000 (04:28 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sun, 4 Jun 2006 04:28:25 +0000 (04:28 +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: r114355

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 34d6f17fe18535c1c1d282317bbdb5e4eb06b036..977f32a79ede64258fa02a6bf31cc0b5b69da8ac 100644 (file)
@@ -1,3 +1,12 @@
+2006-06-03  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-02  Geoffrey Keating  <geoffk@apple.com>
 
        * config/rs6000/host-darwin.c (sigaltstack): Protect prototype with
index 145fc2e523e1b0ed21175621e762026955c6aa74..743535cfe71aa5da6e65cdda484d15685edc7aa2 100644 (file)
@@ -3247,6 +3247,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);
@@ -3285,18 +3290,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 da82da671eb37a2a90e1df99094b085ce3de740d..1553c98c6bfb28109f8af78bd056068eaeeb4d23 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-03  Roger Sayle  <roger@eyesopen.com>
+
+       PR target/26223
+       * gcc.target/i386/amd64-abi-2.c: New test case.
+
 2006-06-02  Eric Christopher  <echristo@apple.com>
 
        * gcc.c-torture/compile/20000804-1.c: Skip if i?86-darwin.
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; }
+