Patchwork [i386] : Fix XPASS: gcc.target/i386/builtin-apply-mmx.c execution test + some cleanups

login
register
mail settings
Submitter Uros Bizjak
Date Sept. 6, 2011, 9:05 p.m.
Message ID <CAFULd4ZktjDfaMtVwpbJ1u7khPJaE7Qu8opyWnLbQQSkK71UhQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/113667/
State New
Headers show

Comments

Uros Bizjak - Sept. 6, 2011, 9:05 p.m.
Hello!

x32 follows x86_64 ABI, so no MMX regs are saved/restored in
__builtin_apply_args/__builtin_return, even with -mmmx. The patch also
includes some cleanups in this area.

2011-09-06  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.c (ix86_function_value_regno_p): Use AX_REG.
	(function_value_32): Do not check TARGET_MMX, TARGET_SSE or TARGET_AVX.

testsuite/ChangeLog:

2011-09-06  Uros Bizjak  <ubizjak@gmail.com>

	* gcc.target/i386/builtin-apply-mmx.c: Require ia32 effective target.

Tested on x86_64-pc-linux-gnu {,-m32}, committed to mainline SVN.

Uros.

Patch

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 178608)
+++ config/i386/i386.c	(working copy)
@@ -7015,7 +7015,7 @@  ix86_function_value_regno_p (const unsigned int re
 {
   switch (regno)
     {
-    case 0:
+    case AX_REG:
       return true;
 
     case FIRST_FLOAT_REG:
@@ -7053,18 +7053,18 @@  function_value_32 (enum machine_mode orig_mode, en
      we normally prevent this case when mmx is not available.  However
      some ABIs may require the result to be returned like DImode.  */
   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
-    regno = TARGET_MMX ? FIRST_MMX_REG : 0;
+    regno = FIRST_MMX_REG;
 
   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
      we prevent this case when sse is not available.  However some ABIs
      may require the result to be returned like integer TImode.  */
   else if (mode == TImode
 	   || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
-    regno = TARGET_SSE ? FIRST_SSE_REG : 0;
+    regno = FIRST_SSE_REG;
 
   /* 32-byte vector modes in %ymm0.   */
   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
-    regno = TARGET_AVX ? FIRST_SSE_REG : 0;
+    regno = FIRST_SSE_REG;
 
   /* 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)
@@ -7098,6 +7098,8 @@  function_value_64 (enum machine_mode orig_mode, en
   /* Handle libcalls, which don't provide a type node.  */
   if (valtype == NULL)
     {
+      unsigned int regno;
+
       switch (mode)
 	{
 	case SFmode:
@@ -7108,15 +7110,19 @@  function_value_64 (enum machine_mode orig_mode, en
 	case SDmode:
 	case DDmode:
 	case TDmode:
-	  return gen_rtx_REG (mode, FIRST_SSE_REG);
+	  regno = FIRST_SSE_REG;
+	  break;
 	case XFmode:
 	case XCmode:
-	  return gen_rtx_REG (mode, FIRST_FLOAT_REG);
+	  regno = FIRST_FLOAT_REG;
+	  break;
 	case TCmode:
 	  return NULL;
 	default:
-	  return gen_rtx_REG (mode, AX_REG);
+	  regno = AX_REG;
 	}
+
+      return gen_rtx_REG (mode, regno);
     }
   else if (POINTER_TYPE_P (valtype))
     {
Index: testsuite/gcc.target/i386/builtin-apply-mmx.c
===================================================================
--- testsuite/gcc.target/i386/builtin-apply-mmx.c	(revision 178608)
+++ testsuite/gcc.target/i386/builtin-apply-mmx.c	(working copy)
@@ -11,7 +11,7 @@ 
  
 /* { dg-do run { xfail { ! *-*-darwin* } } } */
 /* { dg-options "-O2 -mmmx" } */
-/* { dg-require-effective-target ilp32 } */
+/* { dg-require-effective-target ia32 } */
 
 #include "mmx-check.h"