public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Andrew Stubbs <ams@codesourcery.com>
To: Julian Brown <julian@codesourcery.com>, <gcc-patches@gcc.gnu.org>
Cc: <fortran@gcc.gnu.org>, Tobias Burnus <tobias@codesourcery.com>,
	Jakub Jelinek <jakub@redhat.com>,
	Thomas Schwinge <thomas@codesourcery.com>
Subject: Re: [PATCH 4/5] amdgcn: Enable support for TImode for AMD GCN
Date: Fri, 18 Jun 2021 16:08:04 +0100	[thread overview]
Message-ID: <7ccae26a-b1ae-68f6-9be2-8f80cc2c880c@codesourcery.com> (raw)
In-Reply-To: <ee2545943d16d684cb83b5b03ce67360068d4bcf.1624025450.git.julian@codesourcery.com>

On 18/06/2021 15:19, Julian Brown wrote:
> This patch enables support for TImode for AMD GCN, the lack of which
> is currently causing a number of test failures for the target and which
> is also needed to support "omp_depend_kind" for OpenMP 5.0, since that
> is implemented as a 128-bit integer.
> 
> Several libgcc support routines are built by default for the "word size"
> of a machine, and also for "2 * word size" of the machine.  The libgcc
> build for AMD GCN is changed so that it builds for a "word size" of 64
> bits, in order to better match the (64-bit) host compiler.  However it
> isn't really true that we have 64-bit words -- GCN has 32-bit registers,
> so changing UNITS_PER_WORD unconditionally would be the wrong thing to do.
> 
> Changing this setting for libgcc (only) means that support routines
> are built for "single word" operations that are DImode (64 bits), and
> those for "double word" operations are built for TImode (128 bits).
> That leaves some gaps regarding previous operations that were built
> for a "single word" size of 32 bits and a "double word" size of 64 bits
> (generic code doesn't cover both alternatives for all operations that
> might be needed).  Those gaps are filled in by this patch, or by the
> preceding patches in the series.
> 
> I can probably self-approve this, but I'll give Andrew Stubbs a chance
> to comment.
> 
> Thanks,
> 
> Julian
> 
> 2021-06-18  Julian Brown  <julian@codesourcery.com>
> 
> gcc/
> 	* config/gcn/gcn.c (gcn_init_libfuncs): New function.
> 	(TARGET_INIT_LIBFUNCS): Define target hook using above function.
> 	* config/gcn/gcn.h (UNITS_PER_WORD): Define to 8 for IN_LIBGCC2, 4
> 	otherwise.
> 	(LIBGCC2_UNITS_PER_WORD, BITS_PER_WORD): Remove definitions.
> 	(MAX_FIXED_MODE_SIZE): Change to 128.
> 
> libgcc/
> 	* config/gcn/lib2-bswapti2.c: New file.
> 	* config/gcn/lib2-divmod-di.c: New file.
> 	* config/gcn/lib2-gcn.h (DItype, UDItype, TItype, UTItype): Add
> 	typedefs.
> 	(__divdi3, __moddi3, __udivdi3, __umoddi3): Add prototypes.
> 	* config/gcn/t-amdgcn (LIB2ADD): Add lib2-divmod-di.c and
> 	lib2-bswapti2.c.
> ---
>   gcc/config/gcn/gcn.c               | 30 +++++++++++++++++++
>   gcc/config/gcn/gcn.h               | 11 ++++---
>   libgcc/config/gcn/lib2-bswapti2.c  | 47 ++++++++++++++++++++++++++++++
>   libgcc/config/gcn/lib2-divmod-di.c | 35 ++++++++++++++++++++++
>   libgcc/config/gcn/lib2-gcn.h       |  8 +++++
>   libgcc/config/gcn/t-amdgcn         |  2 ++
>   6 files changed, 129 insertions(+), 4 deletions(-)
>   create mode 100644 libgcc/config/gcn/lib2-bswapti2.c
>   create mode 100644 libgcc/config/gcn/lib2-divmod-di.c
> 
> diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
> index 283a91fe50a..45f37d5310d 100644
> --- a/gcc/config/gcn/gcn.c
> +++ b/gcc/config/gcn/gcn.c
> @@ -3610,6 +3610,34 @@ gcn_init_builtins (void)
>   #endif
>   }
>   
> +/* Implement TARGET_INIT_LIBFUNCS.  */
> +
> +static void
> +gcn_init_libfuncs (void)
> +{
> +  /* BITS_PER_UNIT * 2 is 64 bits, which causes
> +     optabs-libfuncs.c:gen_int_libfunc to omit TImode (i.e 128 bits)
> +     libcalls that we need to support operations for that type.  Initialise
> +     them here instead.  */
> +  set_optab_libfunc (udiv_optab, TImode, "__udivti3");
> +  set_optab_libfunc (umod_optab, TImode, "__umodti3");
> +  set_optab_libfunc (sdiv_optab, TImode, "__divti3");
> +  set_optab_libfunc (smod_optab, TImode, "__modti3");
> +  set_optab_libfunc (smul_optab, TImode, "__multi3");
> +  set_optab_libfunc (addv_optab, TImode, "__addvti3");
> +  set_optab_libfunc (subv_optab, TImode, "__subvti3");
> +  set_optab_libfunc (negv_optab, TImode, "__negvti2");
> +  set_optab_libfunc (absv_optab, TImode, "__absvti2");
> +  set_optab_libfunc (smulv_optab, TImode, "__mulvti3");
> +  set_optab_libfunc (ffs_optab, TImode, "__ffsti2");
> +  set_optab_libfunc (clz_optab, TImode, "__clzti2");
> +  set_optab_libfunc (ctz_optab, TImode, "__ctzti2");
> +  set_optab_libfunc (clrsb_optab, TImode, "__clrsbti2");
> +  set_optab_libfunc (popcount_optab, TImode, "__popcountti2");
> +  set_optab_libfunc (parity_optab, TImode, "__parityti2");
> +  set_optab_libfunc (bswap_optab, TImode, "__bswapti2");
> +}
> +
>   /* Expand the CMP_SWAP GCN builtins.  We have our own versions that do
>      not require taking the address of any object, other than the memory
>      cell being operated on.
> @@ -6336,6 +6364,8 @@ gcn_dwarf_register_span (rtx rtl)
>   #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
>   #undef  TARGET_INIT_BUILTINS
>   #define TARGET_INIT_BUILTINS gcn_init_builtins
> +#undef  TARGET_INIT_LIBFUNCS
> +#define TARGET_INIT_LIBFUNCS gcn_init_libfuncs
>   #undef  TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS
>   #define TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS \
>     gcn_ira_change_pseudo_allocno_class
> diff --git a/gcc/config/gcn/gcn.h b/gcc/config/gcn/gcn.h
> index eba4646f1bf..540835b81cc 100644
> --- a/gcc/config/gcn/gcn.h
> +++ b/gcc/config/gcn/gcn.h
> @@ -46,9 +46,12 @@
>   #define BYTES_BIG_ENDIAN 0
>   #define WORDS_BIG_ENDIAN 0
>   
> -#define BITS_PER_WORD 32
> -#define UNITS_PER_WORD (BITS_PER_WORD/BITS_PER_UNIT)
> -#define LIBGCC2_UNITS_PER_WORD 4
> +#ifdef IN_LIBGCC2
> +/* We want DImode and TImode helpers.  */
> +#define UNITS_PER_WORD 8
> +#else
> +#define UNITS_PER_WORD 4
> +#endif
>   
>   #define POINTER_SIZE	     64
>   #define PARM_BOUNDARY	     64
> @@ -56,7 +59,7 @@
>   #define FUNCTION_BOUNDARY    32
>   #define BIGGEST_ALIGNMENT    64
>   #define EMPTY_FIELD_BOUNDARY 32
> -#define MAX_FIXED_MODE_SIZE  64
> +#define MAX_FIXED_MODE_SIZE  128
>   #define MAX_REGS_PER_ADDRESS 2
>   #define STACK_SIZE_MODE      DImode
>   #define Pmode		     DImode
> diff --git a/libgcc/config/gcn/lib2-bswapti2.c b/libgcc/config/gcn/lib2-bswapti2.c
> new file mode 100644
> index 00000000000..c19b70b7cd3
> --- /dev/null
> +++ b/libgcc/config/gcn/lib2-bswapti2.c
> @@ -0,0 +1,47 @@
> +/* Copyright (C) 2021 Free Software Foundation, Inc.
> +
> +This file is free software; you can redistribute it and/or modify it
> +under the terms of the GNU General Public License as published by the
> +Free Software Foundation; either version 3, or (at your option) any
> +later version.
> +
> +This file is distributed in the hope that it will be useful, but
> +WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +General Public License for more details.
> +
> +Under Section 7 of GPL version 3, you are granted additional
> +permissions described in the GCC Runtime Library Exception, version
> +3.1, as published by the Free Software Foundation.
> +
> +You should have received a copy of the GNU General Public License and
> +a copy of the GCC Runtime Library Exception along with this program;
> +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +<http://www.gnu.org/licenses/>.  */
> +
> +#include "lib2-gcn.h"
> +
> +UTItype
> +__bswapti2 (UTItype x)
> +{
> +  UDItype lo, hi, outlo, outhi;
> +  lo = (UDItype) x;
> +  hi = (UDItype) (x >> 64);
> +  outhi = (lo >> 56) & 0xff;
> +  outhi |= ((lo >> 48) & 0xff) << 8;
> +  outhi |= ((lo >> 40) & 0xff) << 16;
> +  outhi |= ((lo >> 32) & 0xff) << 24;
> +  outhi |= ((lo >> 24) & 0xff) << 32;
> +  outhi |= ((lo >> 16) & 0xff) << 40;
> +  outhi |= ((lo >> 8) & 0xff) << 48;
> +  outhi |= (lo & 0xff) << 56;
> +  outlo = (hi >> 56) & 0xff;
> +  outlo |= ((hi >> 48) & 0xff) << 8;
> +  outlo |= ((hi >> 40) & 0xff) << 16;
> +  outlo |= ((hi >> 32) & 0xff) << 24;
> +  outlo |= ((hi >> 24) & 0xff) << 32;
> +  outlo |= ((hi >> 16) & 0xff) << 40;
> +  outlo |= ((hi >> 8) & 0xff) << 48;
> +  outlo |= (hi & 0xff) << 56;
> +  return ((UTItype) outhi << 64) | outlo;
> +}
> diff --git a/libgcc/config/gcn/lib2-divmod-di.c b/libgcc/config/gcn/lib2-divmod-di.c
> new file mode 100644
> index 00000000000..ceb3962eb7e
> --- /dev/null
> +++ b/libgcc/config/gcn/lib2-divmod-di.c
> @@ -0,0 +1,35 @@
> +/* Copyright (C) 2021 Free Software Foundation, Inc.
> +   Contributed by Mentor Graphics, Inc.
> +
> +This file is free software; you can redistribute it and/or modify it
> +under the terms of the GNU General Public License as published by the
> +Free Software Foundation; either version 3, or (at your option) any
> +later version.
> +
> +This file is distributed in the hope that it will be useful, but
> +WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +General Public License for more details.
> +
> +Under Section 7 of GPL version 3, you are granted additional
> +permissions described in the GCC Runtime Library Exception, version
> +3.1, as published by the Free Software Foundation.
> +
> +You should have received a copy of the GNU General Public License and
> +a copy of the GCC Runtime Library Exception along with this program;
> +see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +<http://www.gnu.org/licenses/>.  */
> +
> +#include "lib2-gcn.h"
> +
> +/* We really want DImode here: override LIBGCC2_UNITS_PER_WORD.  */
> +#define LIBGCC2_UNITS_PER_WORD 4
> +#define TARGET_HAS_NO_HW_DIVIDE
> +
> +#define L_divmoddi4
> +#define L_divdi3
> +#define L_moddi3
> +#define L_udivdi3
> +#define L_umoddi3
> +
> +#include "libgcc2.c"
> diff --git a/libgcc/config/gcn/lib2-gcn.h b/libgcc/config/gcn/lib2-gcn.h
> index 9223d73b8e7..155cf7c691d 100644
> --- a/libgcc/config/gcn/lib2-gcn.h
> +++ b/libgcc/config/gcn/lib2-gcn.h
> @@ -33,9 +33,17 @@ typedef short HItype __attribute__ ((mode (HI)));
>   typedef unsigned short UHItype __attribute__ ((mode (HI)));
>   typedef int SItype __attribute__ ((mode (SI)));
>   typedef unsigned int USItype __attribute__ ((mode (SI)));
> +typedef int DItype __attribute__ ((mode (DI)));
> +typedef unsigned int UDItype __attribute__ ((mode (DI)));
> +typedef int TItype __attribute__ ((mode (TI)));
> +typedef unsigned int UTItype __attribute__ ((mode (TI)));
>   typedef int word_type __attribute__ ((mode (__word__)));
>   
>   /* Exported functions.  */
> +extern DItype __divdi3 (DItype, DItype);
> +extern DItype __moddi3 (DItype, DItype);
> +extern UDItype __udivdi3 (UDItype, UDItype);
> +extern UDItype __umoddi3 (UDItype, UDItype);
>   extern SItype __divsi3 (SItype, SItype);
>   extern SItype __modsi3 (SItype, SItype);
>   extern USItype __udivsi3 (USItype, USItype);
> diff --git a/libgcc/config/gcn/t-amdgcn b/libgcc/config/gcn/t-amdgcn
> index fe7b5fad84d..38bde54a096 100644
> --- a/libgcc/config/gcn/t-amdgcn
> +++ b/libgcc/config/gcn/t-amdgcn
> @@ -1,6 +1,8 @@
>   LIB2ADD += $(srcdir)/config/gcn/atomic.c \
>   	   $(srcdir)/config/gcn/lib2-divmod.c \
>   	   $(srcdir)/config/gcn/lib2-divmod-hi.c \
> +	   $(srcdir)/config/gcn/lib2-divmod-di.c \
> +	   $(srcdir)/config/gcn/lib2-bswapti2.c \
>   	   $(srcdir)/config/gcn/unwind-gcn.c
>   
>   LIB2ADDEH=
> 

OK, it feels a bit wrong, but I don't see the point in having libgcc 
functions for SImode stuff we support anyway, so let's do it!

Andrew

  reply	other threads:[~2021-06-18 15:08 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-18 14:19 [PATCH 0/5] amdgcn: Improve TImode support Julian Brown
2021-06-18 14:19 ` [PATCH 1/5] amdgcn: Use unsigned types for udivsi3/umodsi3 libgcc helper args/return Julian Brown
2021-06-18 15:15   ` Andrew Stubbs
2021-06-18 14:19 ` [PATCH 2/5] amdgcn: Add [us]mulsi3_highpart SGPR alternatives & [us]mulsid3/muldi3 expanders Julian Brown
2021-06-18 14:55   ` Andrew Stubbs
2021-06-29 15:10     ` Julian Brown
2021-06-18 14:19 ` [PATCH 3/5] amdgcn: Add clrsbsi2/clrsbdi2 implementation Julian Brown
2021-06-18 15:01   ` Andrew Stubbs
2021-06-18 14:19 ` [PATCH 4/5] amdgcn: Enable support for TImode for AMD GCN Julian Brown
2021-06-18 15:08   ` Andrew Stubbs [this message]
2021-06-18 14:20 ` [PATCH 5/5] Fortran: Re-enable 128-bit integers " Julian Brown
2021-06-21 11:15   ` Tobias Burnus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7ccae26a-b1ae-68f6-9be2-8f80cc2c880c@codesourcery.com \
    --to=ams@codesourcery.com \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    --cc=julian@codesourcery.com \
    --cc=thomas@codesourcery.com \
    --cc=tobias@codesourcery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).