Re: How to add 256 byte sized opaque mode in gcc

Richard Biener via Gcc <[email protected]>
Newsgroups gmane.comp.gcc.devel
Message-ID <[email protected]>
On Wed, 19 Aug 2026, Avinash Jayakar wrote:

> Hi Jakub/Richard,
> 
> Thank you for these suggestions and review.
> 
> I have attached the proposed patch based on your input to dynamically
> size the mode_unit_size array based on maximum bytesize declared in
> machine modes.
> 
> Please do let me know if any tests are required for this before sending
> to gcc-patches?

+  unsigned int max_type_size = 0;
+  for_all_modes (c, m)
+    {
+      if (max_type_size < m->bytesize)
+       max_type_size = 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");
+

I think you need to account for bits_per_unit here, meaning
you want to track max_unit_size which would be
((size_t)m->bytesize * 8) / bits_per_unit

Richard.

> Also as you mentioned these lookups happen quite often in compilation,
> so introducing this new mode could potentially increase compile times
> for powerpc64le right?
> 
> Thanks and regards,
> Avinash Jayakar
> 
> On Tue, 2026-08-18 at 13:06 +0200, Jakub Jelinek via Gcc wrote:
> > On Tue, Aug 18, 2026 at 12:48:55PM +0200, Richard Biener via Gcc
> > wrote:
> > > I'd use unsigned short, it's important to not use an overly large
> > > data
> > > structure for those common lookups to reduce cache footprint.  We
> > > could possibly even dynamically size the component from genmodes?
> > 
> > Yeah, I'd prefer that, emit a typedef/macro in insn-modes.h, say
> > MODE_UNIT_SIZE_TYPE, unsigned char or unsigned short depending in
> > whether all modes fit or don't fit into 255 bytes and use it for the
> > generated array too.  Similar to how e.g. the CONST_MODE_* macros
> > are defined.
> > 
> > > > @@ -1884,6 +1885,11 @@ rs6000_hard_regno_mode_ok_uncached (int
> > > > regno, machine_mode mode)
> > > >        else
> > > >  	return 0;
> > > >      }
> > > > +  /* QDOmode needs even/odd DMR register pairs.  */
> > > > +  if (mode == QDOmode)
> > > > +    {
> > > > +      return (TARGET_DMF && DMR_REGNO_P (regno) && (regno & 1)
> > > > == 0);
> > > > +    }
> > 
> > The GCC coding style here is to avoid the {}s around a single
> > statement
> > body.
> Sure I will update this.
> > 
> > 	Jakub
> 

-- 
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)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.