[AVX]: Handle 256bit type passing

H.J. Lu hongjiu.lu@intel.com
Fri Aug 1 18:13:00 GMT 2008


I am checking in this patch to handle 256bit type passing according
to the psABI extension:

http://gcc.gnu.org/ml/gcc/2008-06/msg00408.html


H.J.
---
Index: ChangeLog.avx
===================================================================
--- ChangeLog.avx	(revision 138527)
+++ ChangeLog.avx	(working copy)
@@ -1,5 +1,25 @@
 2008-08-01  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* config/i386/i386.c (x86_64_reg_class): Add X86_64_AVX_CLASS.
+	(classify_argument): Return 0 for COImode and OImode.  Return
+	1 and X86_64_AVX_CLASS for 256bit vector types.
+	(examine_argument): Handle X86_64_AVX_CLASS.
+	(construct_container): Likewise.
+	(function_arg_advance_32): Pass OImode in AVX register.
+	(function_arg_advance_64): Take a new argument to indicate if a
+	parameter is named.  Return immediately for unnamed 256bit
+	vector mode parameters.
+	(function_arg_advance): Updated.
+	(function_arg_32): Add comments for TImode and OImode.
+	(function_arg_64): Take a new argument to indicate if a
+	parameter is named.  Don't pass OImode in AVX register.
+	Return NULL for unnamed 256bit vector mode parameters.
+	(function_arg): Updated.
+	(ix86_gimplify_va_arg): Handle unnamed 256bit vector mode
+	parameters.
+
+2008-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
 	* config/i386/sse.md (avx_maskloadp<avxmodesuffixf2c><avxmodesuffix>):
 	Add (match_dup 0).
 	(avx_maskstorep<avxmodesuffixf2c><avxmodesuffix>): Likewise.
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 138526)
+++ config/i386/i386.c	(working copy)
@@ -1764,6 +1764,7 @@ enum x86_64_reg_class
     X86_64_NO_CLASS,
     X86_64_INTEGER_CLASS,
     X86_64_INTEGERSI_CLASS,
+    X86_64_AVX_CLASS,
     X86_64_SSE_CLASS,
     X86_64_SSESF_CLASS,
     X86_64_SSEDF_CLASS,
@@ -5007,6 +5008,8 @@ classify_argument (enum machine_mode mod
       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
       return 2;
     case CTImode:
+    case COImode:
+    case OImode:
       return 0;
     case SFmode:
       if (!(bit_offset % 64))
@@ -5044,6 +5047,8 @@ classify_argument (enum machine_mode mod
     case V16HImode:
     case V4DFmode:
     case V4DImode:
+      classes[0] = X86_64_AVX_CLASS;
+      return 1;
     case V4SFmode:
     case V4SImode:
     case V16QImode:
@@ -5100,6 +5105,7 @@ examine_argument (enum machine_mode mode
       case X86_64_INTEGERSI_CLASS:
 	(*int_nregs)++;
 	break;
+      case X86_64_AVX_CLASS:
       case X86_64_SSE_CLASS:
       case X86_64_SSESF_CLASS:
       case X86_64_SSEDF_CLASS:
@@ -5198,6 +5204,7 @@ construct_container (enum machine_mode m
       case X86_64_INTEGER_CLASS:
       case X86_64_INTEGERSI_CLASS:
 	return gen_rtx_REG (mode, intreg[0]);
+      case X86_64_AVX_CLASS:
       case X86_64_SSE_CLASS:
       case X86_64_SSESF_CLASS:
       case X86_64_SSEDF_CLASS:
@@ -5331,13 +5338,14 @@ function_arg_advance_32 (CUMULATIVE_ARGS
 	break;
       /* FALLTHRU */
 
-    case TImode:
+    case OImode:
     case V8SFmode:
     case V8SImode:
     case V32QImode:
     case V16HImode:
     case V4DFmode:
     case V4DImode:
+    case TImode:
     case V16QImode:
     case V8HImode:
     case V4SImode:
@@ -5379,10 +5387,26 @@ function_arg_advance_32 (CUMULATIVE_ARGS
 
 static void
 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
-			 tree type, HOST_WIDE_INT words)
+			 tree type, HOST_WIDE_INT words, int named)
 {
   int int_nregs, sse_nregs;
 
+  switch (mode)
+    {
+    case V8SFmode:
+    case V8SImode:
+    case V32QImode:
+    case V16HImode:
+    case V4DFmode:
+    case V4DImode:
+      /* Unnamed 256bit vector mode parameters are passed on stack.  */
+      if (!named)
+	return;
+
+    default:
+      break;
+    }
+
   if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
     cum->words += words;
   else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
@@ -5413,7 +5437,7 @@ function_arg_advance_ms_64 (CUMULATIVE_A
 
 void
 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
-		      tree type, int named ATTRIBUTE_UNUSED)
+		      tree type, int named)
 {
   HOST_WIDE_INT bytes, words;
 
@@ -5429,7 +5453,7 @@ function_arg_advance (CUMULATIVE_ARGS *c
   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
     function_arg_advance_ms_64 (cum, bytes, words);
   else if (TARGET_64BIT)
-    function_arg_advance_64 (cum, mode, type, words);
+    function_arg_advance_64 (cum, mode, type, words, named);
   else
     function_arg_advance_32 (cum, mode, type, bytes, words);
 }
@@ -5501,6 +5525,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, e
 	break;
       /* FALLTHRU */
     case TImode:
+      /* In 32bit, we pass TImode in xmm registers.  */
     case V16QImode:
     case V8HImode:
     case V4SImode:
@@ -5522,6 +5547,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, e
       break;
 
     case OImode:
+      /* In 32bit, we pass OImode in ymm registers.  */
     case V8SFmode:
     case V8SImode:
     case V32QImode:
@@ -5567,7 +5593,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, e
 
 static rtx
 function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
-		 enum machine_mode orig_mode, tree type)
+		 enum machine_mode orig_mode, tree type, int named)
 {
   static bool warnedavx;
 
@@ -5588,13 +5614,14 @@ function_arg_64 (CUMULATIVE_ARGS *cum, e
     default:
       break;
 
-    case OImode:
     case V8SFmode:
     case V8SImode:
     case V32QImode:
     case V16HImode:
     case V4DFmode:
     case V4DImode:
+      /* In 64bit, we pass TImode in interger registers and OImode on
+	 stack.  */
       if (!type || !AGGREGATE_TYPE_P (type))
 	{
 	  if (!TARGET_AVX && !warnedavx && cum->warn_avx)
@@ -5604,6 +5631,10 @@ function_arg_64 (CUMULATIVE_ARGS *cum, e
 		       "changes the ABI");
 	    }
 	}
+
+      /* Unnamed 256bit vector mode parameters are passed on stack.  */
+      if (!named)
+	return NULL;
       break;
     }
 
@@ -5681,7 +5712,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum
   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
     return function_arg_ms_64 (cum, mode, omode, named, bytes);
   else if (TARGET_64BIT)
-    return function_arg_64 (cum, mode, omode, type);
+    return function_arg_64 (cum, mode, omode, type, named);
   else
     return function_arg_32 (cum, mode, omode, type, bytes, words);
 }
@@ -6530,9 +6561,28 @@ ix86_gimplify_va_arg (tree valist, tree 
   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
 
   nat_mode = type_natural_mode (type);
-  container = construct_container (nat_mode, TYPE_MODE (type), type, 0,
-				   X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
-				   intreg, 0);
+  switch (nat_mode)
+    {
+    case V8SFmode:
+    case V8SImode:
+    case V32QImode:
+    case V16HImode:
+    case V4DFmode:
+    case V4DImode:
+      /* Unnamed 256bit vector mode parameters are passed on stack.  */
+      if (ix86_cfun_abi () == SYSV_ABI)
+	{
+	  container = NULL;
+	  break;
+	}
+
+    default:
+      container = construct_container (nat_mode, TYPE_MODE (type),
+				       type, 0, X86_64_REGPARM_MAX,
+				       X86_64_SSE_REGPARM_MAX, intreg,
+				       0);
+      break;
+    }
 
   /* Pull the value out of the saved registers.  */
 



More information about the Gcc-patches mailing list