]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/39256 (__m256 isn't returned in ymm0 in 32bit)
authorH.J. Lu <hjl@gcc.gnu.org>
Sat, 21 Feb 2009 15:55:53 +0000 (07:55 -0800)
committerH.J. Lu <hjl@gcc.gnu.org>
Sat, 21 Feb 2009 15:55:53 +0000 (07:55 -0800)
gcc/

2008-02-21  H.J. Lu  <hongjiu.lu@intel.com>

PR target/39256
* config/i386/i386.c (type_natural_mode): Remove an extra
space in the warning message.
(function_value_32): Handle 32-byte vector modes.
(return_in_memory_32): Likewise.

gcc/testsuite/

2008-02-21  Uros Bizjak  <ubizjak@gmail.com>

PR target/39256
* gcc.target/i386/abi-2.c: New.

From-SVN: r144355

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

index 0594bf64c184cca6f91670e85c248b99df681169..c7e1c2fbdfa879fc5d730f4ebcac59299b717c31 100644 (file)
@@ -1,3 +1,11 @@
+2008-02-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/39256
+       * config/i386/i386.c (type_natural_mode): Remove an extra
+       space in the warning message.
+       (function_value_32): Handle 32-byte vector modes.
+       (return_in_memory_32): Likewise.
+
 2009-02-21  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * loop-iv.c (truncate_value): New function.
index e41f501c35ac90ce6993e032a8057ca3a434cd62..d247d07be03abfe00df28df664f5c3077ef17994 100644 (file)
@@ -4759,7 +4759,7 @@ type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
                      {
                        warnedavx = true;
                        warning (0, "AVX vector argument without AVX "
-                                " enabled changes the ABI");
+                                "enabled changes the ABI");
                      }
                    return TYPE_MODE (type);
                  }
@@ -6019,6 +6019,11 @@ function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
           || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
 
+  /* 32-byte vector modes in %ymm0.   */
+  else if (mode == OImode
+          || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32))
+    regno = TARGET_AVX ? FIRST_SSE_REG : 0;
+
   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
     regno = FIRST_FLOAT_REG;
@@ -6158,7 +6163,7 @@ return_in_memory_32 (const_tree type, enum machine_mode mode)
   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
     return 0;
 
-  if (VECTOR_MODE_P (mode) || mode == TImode)
+  if (VECTOR_MODE_P (mode) || mode == TImode || mode == OImode)
     {
       /* User-created vectors small enough to fit in EAX.  */
       if (size < 8)
@@ -6172,6 +6177,10 @@ return_in_memory_32 (const_tree type, enum machine_mode mode)
       /* SSE values are returned in XMM0, except when it doesn't exist.  */
       if (size == 16)
        return (TARGET_SSE ? 0 : 1);
+
+      /* AVX values are returned in YMM0, except when it doesn't exist.  */
+      if (size == 32)
+       return TARGET_AVX ? 0 : 1;
     }
 
   if (mode == XFmode)
index 4cde518f2966b0db758adaf8206ccfc581501993..160b9f69b69df3f5a2b5a71fe96bb925c3b541f2 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-21  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/39256
+       * gcc.target/i386/abi-2.c: New.
+
 2009-02-21  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * gcc.c-torture/execute/pr39228.x: New.
diff --git a/gcc/testsuite/gcc.target/i386/abi-2.c b/gcc/testsuite/gcc.target/i386/abi-2.c
new file mode 100644 (file)
index 0000000..5ed6b4a
--- /dev/null
@@ -0,0 +1,8 @@
+/* Make certain that we pass __m256i in the correct register for AVX.  */
+/* { dg-do compile } */
+/* { dg-options "-O1 -mavx" } */
+
+typedef long long __m256i __attribute__ ((__vector_size__ (32)));
+__m256i foo (void) { return (__m256i){ 1, 2, 3, 4 }; }
+
+/* { dg-final { scan-assembler-times "ymm0" 1 } } */