On Thu, 27 Aug 2026, Avinash Jayakar wrote:

> The mode_unit_size array that is generated from
> emit_mode_unit_size_inline function currently hard codes the type of
> this array to unsigned char, since for most architectures the
> mode_unit_size never exceeded 255.
> 
> For rs6000 however, we add an opaque mode with 256 bytes which overflows
> this type. Therefore this patch adds a macro named MODE_UNIT_SIZE_TYPE
> in the generated file which is defined based on the maximum value that
> the mode_unit_size array will hold.
> if < 256, unsigned char
> else if < 1^16, unsigned short
> else, usigned int

LGTM, but please give others a chance to raise issues.

Thanks,
Richard.

> 2026-08-26  Avinash Jayakar  <[email protected]>
> 
> gcc/ChangeLog:
>       * genmodes.cc (emit_mode_unit_size): Generate MODE_UNIT_SIZE_TYPE macro 
> based
>       on values in mode_unit_size.
>       * machmode.h: Use the new macro.
> ---
>  gcc/genmodes.cc | 20 +++++++++++++++++---
>  gcc/machmode.h  |  2 +-
>  2 files changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/gcc/genmodes.cc b/gcc/genmodes.cc
> index fa5f8923519..f50d39e4ea4 100644
> --- a/gcc/genmodes.cc
> +++ b/gcc/genmodes.cc
> @@ -1167,16 +1167,30 @@ emit_mode_unit_size_inline (void)
>    int c;
>    struct mode_data *m;
>  
> +  unsigned int max_type_size = 0;
> +  for_all_modes (c, m)
> +    {
> +      if (max_type_size < m->bytesize)
> +     max_type_size = (c != MODE_PARTIAL_INT && m->component)
> +                     ? m->component->bytesize : m->bytesize;
> +    }
> +  if (max_type_size < (1 << 8))
> +    puts ("#define MODE_UNIT_SIZE_TYPE unsigned char\n");
> +  else if (max_type_size < (1 << 16))
> +    puts ("#define MODE_UNIT_SIZE_TYPE unsigned short\n");
> +  else
> +    puts ("#define MODE_UNIT_SIZE_TYPE unsigned int\n");
> +
>    puts ("\
>  #ifdef __cplusplus\n\
>  inline __attribute__((__always_inline__))\n\
>  #else\n\
>  extern __inline__ __attribute__((__always_inline__, __gnu_inline__))\n\
>  #endif\n\
> -unsigned char\n\
> +MODE_UNIT_SIZE_TYPE\n\
>  mode_unit_size_inline (machine_mode mode)\n\
>  {\n\
> -  extern CONST_MODE_UNIT_SIZE unsigned char 
> mode_unit_size[NUM_MACHINE_MODES];\
> +  extern CONST_MODE_UNIT_SIZE MODE_UNIT_SIZE_TYPE 
> mode_unit_size[NUM_MACHINE_MODES];\
>  \n\
>    gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\
>    switch (mode)\n\
> @@ -1683,7 +1697,7 @@ emit_mode_unit_size (void)
>    int c;
>    struct mode_data *m;
>  
> -  print_maybe_const_decl ("%sunsigned char", "mode_unit_size",
> +  print_maybe_const_decl ("%sMODE_UNIT_SIZE_TYPE", "mode_unit_size",
>                         "NUM_MACHINE_MODES", adj_bytesize);
>  
>    for_all_modes (c, m)
> diff --git a/gcc/machmode.h b/gcc/machmode.h
> index b92b1572d8d..468fa886910 100644
> --- a/gcc/machmode.h
> +++ b/gcc/machmode.h
> @@ -26,7 +26,7 @@ extern CONST_MODE_SIZE poly_uint16 
> mode_size[NUM_MACHINE_MODES];
>  extern CONST_MODE_PRECISION poly_uint16 mode_precision[NUM_MACHINE_MODES];
>  extern const unsigned short mode_inner[NUM_MACHINE_MODES];
>  extern CONST_MODE_NUNITS poly_uint16 mode_nunits[NUM_MACHINE_MODES];
> -extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];
> +extern CONST_MODE_UNIT_SIZE MODE_UNIT_SIZE_TYPE 
> mode_unit_size[NUM_MACHINE_MODES];
>  extern const unsigned short mode_unit_precision[NUM_MACHINE_MODES];
>  extern const unsigned short mode_next[NUM_MACHINE_MODES];
>  extern const unsigned short mode_wider[NUM_MACHINE_MODES];
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)

Reply via email to