Patchwork PATCH [x86_64] PR20020 - 128 bit structs not targeted to TImode

login
register
mail settings
Submitter Gary Funck
Date Aug. 14, 2012, 9:34 p.m.
Message ID <20120814213426.GA28966@intrepid.com>
Download mbox | patch
Permalink /patch/177460/
State New
Headers show

Comments

Gary Funck - Aug. 14, 2012, 9:34 p.m.
Attached, is an updated patch (with change logs).

The test cases are now in gcc.target/i386 and the
target selection is "dg-require-effective-target int128" only.

Verified that the tests correctly detect the presence/lack
of TImode support.

- Gary
H.J. Lu - Aug. 15, 2012, 8:18 p.m.
On Tue, Aug 14, 2012 at 2:34 PM, Gary Funck <gary@intrepid.com> wrote:
> Attached, is an updated patch (with change logs).
>
> The test cases are now in gcc.target/i386 and the
> target selection is "dg-require-effective-target int128" only.
>
> Verified that the tests correctly detect the presence/lack
> of TImode support.
>

Here is a patch, which passed tests on Linux/x86-64/ia32 with

--enable-languages=c,c++,fortran,java,lto,objc,ada,obj-c++,go

on Linux/x32 with

--enable-languages=c,c++,fortran,java,lto,objc,obj-c++,go

I skipped Ada on x32 since Ada run-time library assumes
clock_t/time_t are long.

I added a target hook, type_blkmode_p, so that a backend
can force a type to BLKmode.  There is a macro,
MEMBER_TYPE_FORCES_BLK.  But it will also set

struct
{
  long double x;
};

to BLKmode instead of XFmode.  I think we can replace
MEMBER_TYPE_FORCES_BLK with the new type_blkmode_p
target hook.

Patch

Index: gcc/config/i386/i386.h
===================================================================
--- gcc/config/i386/i386.h	(revision 190398)
+++ gcc/config/i386/i386.h	(working copy)
@@ -1816,6 +1816,10 @@  do {							\
 #define BRANCH_COST(speed_p, predictable_p) \
   (!(speed_p) ? 2 : (predictable_p) ? 0 : ix86_branch_cost)
 
+/* An integer expression for the size in bits of the largest integer machine
+   mode that should actually be used.  We allow pairs of registers.  */
+#define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (TARGET_64BIT ? TImode : DImode)
+
 /* Define this macro as a C expression which is nonzero if accessing
    less than a word of memory (i.e. a `char' or a `short') is no
    faster than accessing a word of memory, i.e., if such access
Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 190398)
+++ gcc/ChangeLog	(working copy)
@@ -1,3 +1,10 @@ 
+2012-08-14  Gary Funck <gary@intrepid.com>
+
+	PR target/20020
+	* config/i386/i386.h (MAX_FIXED_MODE_SIZE): Allow use of TImode
+	for use with appropriately sized structures and unions
+	on 64-bit (x86) targets.
+
 2012-08-14  Uros Bizjak  <ubizjak@gmail.com>
 
 	* config/i386/i386.md (enabled): Add comment with explanation
Index: gcc/testsuite/gcc.target/i386/pr20020-1.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr20020-1.c	(revision 0)
+++ gcc/testsuite/gcc.target/i386/pr20020-1.c	(revision 0)
@@ -0,0 +1,23 @@ 
+/* Check that 128-bit struct's are represented as TImode values.  */
+/* { dg-require-effective-target int128 } */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-rtl-expand" } */
+
+struct shared_ptr_struct
+{
+  unsigned long long phase:48;
+  unsigned short thread:16;
+  void *addr;
+};
+typedef struct shared_ptr_struct sptr_t;
+
+sptr_t S;
+
+sptr_t
+sptr_result (void)
+{
+  return S;
+}
+/* { dg-final { scan-rtl-dump "\\\(set \\\(reg:TI \[0-9\]* \\\[ <retval> \\\]\\\)" "expand" } } */
+/* { dg-final { scan-rtl-dump "\\\(set \\\(reg/i:TI 0 ax\\\)" "expand" } } */
+/* { dg-final { cleanup-rtl-dump "expand" } } */
Index: gcc/testsuite/gcc.target/i386/pr20020-2.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr20020-2.c	(revision 0)
+++ gcc/testsuite/gcc.target/i386/pr20020-2.c	(revision 0)
@@ -0,0 +1,21 @@ 
+/* Check that 128-bit struct's are represented as TImode values.  */
+/* { dg-require-effective-target int128 } */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-rtl-expand" } */
+
+struct shared_ptr_struct
+{
+  unsigned long long phase:48;
+  unsigned short thread:16;
+  void *addr;
+};
+typedef struct shared_ptr_struct sptr_t;
+
+void
+copy_sptr (sptr_t *dest, sptr_t src)
+{
+  *dest = src;
+}
+
+/* { dg-final { scan-rtl-dump "\\\(set \\\(reg:TI \[0-9\]*" "expand" } } */
+/* { dg-final { cleanup-rtl-dump "expand" } } */
Index: gcc/testsuite/gcc.target/i386/pr20020-3.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr20020-3.c	(revision 0)
+++ gcc/testsuite/gcc.target/i386/pr20020-3.c	(revision 0)
@@ -0,0 +1,24 @@ 
+/* Check that 128-bit struct's are represented as TImode values.  */
+/* { dg-require-effective-target int128 } */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-rtl-expand" } */
+
+struct shared_ptr_struct
+{
+  unsigned long long phase:48;
+  unsigned short thread:16;
+  void *addr;
+};
+typedef struct shared_ptr_struct sptr_t;
+
+sptr_t sptr_1, sptr_2;
+
+void
+copy_sptr (void)
+{
+  sptr_1 = sptr_2;  
+}
+
+/* { dg-final { scan-rtl-dump "\\\(set \\\(reg:TI \[0-9\]*" "expand" } } */
+/* { dg-final { scan-rtl-dump "\\\(set \\\(mem/c:TI" "expand" } } */
+/* { dg-final { cleanup-rtl-dump "expand" } } */
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(revision 190398)
+++ gcc/testsuite/ChangeLog	(working copy)
@@ -1,3 +1,10 @@ 
+2012-08-14  Gary Funck <gary@intrepid.com>
+
+	PR target/20020
+	* gcc.target/i386/pr20020-1.c: New.
+	* gcc.target/i386/pr20020-2.c: New.
+	* gcc.target/i386/pr20020-3.c: New.
+
 2012-08-14  Oleg Endo  <olegendo@gcc.gnu.org>
 
 	PR target/52933