Ping * 6 Please review!
On 21/03/24 6:21 pm, jeevitha wrote: > Hi All, > > The following patch has been bootstrapped and regtested on powerpc64le-linux. > > PTImode assists in generating even/odd register pairs on 128 bits. When the > user > specifies PTImode as an attribute, it breaks because there is no internal > type > to handle this mode. To address this, we have created a tree node with dummy > type > to handle PTImode. We are not documenting this dummy type since users are not > allowed to use this type externally. > > 2024-03-21 Jeevitha Palanisamy <jeevi...@linux.ibm.com> > > gcc/ > PR target/110411 > * config/rs6000/rs6000.h (enum rs6000_builtin_type_index): Add > RS6000_BTI_INTPTI. > * config/rs6000/rs6000-builtin.cc (rs6000_init_builtins): Add node > for PTImode type. > > gcc/testsuite/ > PR target/106895 > * gcc.target/powerpc/pr106895.c: New testcase. > > diff --git a/gcc/config/rs6000/rs6000-builtin.cc > b/gcc/config/rs6000/rs6000-builtin.cc > index 6698274031b..f553c72779e 100644 > --- a/gcc/config/rs6000/rs6000-builtin.cc > +++ b/gcc/config/rs6000/rs6000-builtin.cc > @@ -756,6 +756,15 @@ rs6000_init_builtins (void) > else > ieee128_float_type_node = NULL_TREE; > > + /* PTImode to get even/odd register pairs. */ > + intPTI_type_internal_node = make_node(INTEGER_TYPE); > + TYPE_PRECISION (intPTI_type_internal_node) = GET_MODE_BITSIZE (PTImode); > + layout_type (intPTI_type_internal_node); > + SET_TYPE_MODE (intPTI_type_internal_node, PTImode); > + t = build_qualified_type (intPTI_type_internal_node, TYPE_QUAL_CONST); > + lang_hooks.types.register_builtin_type (intPTI_type_internal_node, > + "__dummypti"); > + > /* Vector pair and vector quad support. */ > vector_pair_type_node = make_node (OPAQUE_TYPE); > SET_TYPE_MODE (vector_pair_type_node, OOmode); > diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h > index 68bc45d65ba..b6078077b20 100644 > --- a/gcc/config/rs6000/rs6000.h > +++ b/gcc/config/rs6000/rs6000.h > @@ -2302,6 +2302,7 @@ enum rs6000_builtin_type_index > RS6000_BTI_ptr_vector_quad, > RS6000_BTI_ptr_long_long, > RS6000_BTI_ptr_long_long_unsigned, > + RS6000_BTI_INTPTI, > RS6000_BTI_MAX > }; > > @@ -2346,6 +2347,7 @@ enum rs6000_builtin_type_index > #define uintDI_type_internal_node > (rs6000_builtin_types[RS6000_BTI_UINTDI]) > #define intTI_type_internal_node > (rs6000_builtin_types[RS6000_BTI_INTTI]) > #define uintTI_type_internal_node > (rs6000_builtin_types[RS6000_BTI_UINTTI]) > +#define intPTI_type_internal_node > (rs6000_builtin_types[RS6000_BTI_INTPTI]) > #define float_type_internal_node > (rs6000_builtin_types[RS6000_BTI_float]) > #define double_type_internal_node > (rs6000_builtin_types[RS6000_BTI_double]) > #define long_double_type_internal_node > (rs6000_builtin_types[RS6000_BTI_long_double]) > diff --git a/gcc/testsuite/gcc.target/powerpc/pr106895.c > b/gcc/testsuite/gcc.target/powerpc/pr106895.c > new file mode 100644 > index 00000000000..56547b7fa9d > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/pr106895.c > @@ -0,0 +1,15 @@ > +/* PR target/106895 */ > +/* { dg-require-effective-target int128 } */ > +/* { dg-options "-O2" } */ > + > +/* Verify the following generates even/odd register pairs. */ > + > +typedef __int128 pti __attribute__((mode(PTI))); > + > +void > +set128 (pti val, pti *mem) > +{ > + asm("stq %1,%0" : "=m"(*mem) : "r"(val)); > +} > + > +/* { dg-final { scan-assembler "stq \[123\]?\[02468\]" } } */ >