public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH][4/N] Introduce new inline functions for GET_MODE_UNIT_SIZE and GET_MODE_UNIT_PRECISION
@ 2015-08-17 11:52 David Sherwood
  2015-08-18 19:26 ` Jeff Law
  0 siblings, 1 reply; 10+ messages in thread
From: David Sherwood @ 2015-08-17 11:52 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 1178 bytes --]

Hi,

This is the last patch in the series. It follows on from:

[PATCH][3/N] Replace the pattern GET_MODE_BITSIZE (GET_MODE_INNER (m))
with GET_MODE_UNIT_BITSIZE (m)

As a simple optimisation, introduce new inline functions for GET_MODE_UNIT_SIZE
and GET_MODE_UNIT_PRECISION in machmode.h so that we can reduce two inline
calls, i.e. GET_MODE_INNER and GET_MODE_SIZE, into one.

Tested:
aarch64 and aarch64_be - no regressions in gcc testsuite
x86_64 - bootstrap build, no testsuite regressions
arm-none-eabi - no regressions in gcc testsuite

Good to go?
David.

ChangeLog:

2015-07-17  David Sherwood  <david.sherwood@arm.com>

    gcc/
        * genmodes.c (emit_mode_unit_size_inline): New function.
        (emit_mode_unit_precision_inline): New function.
        (emit_insn_modes_h): Emit new #define.  Emit new functions.
        (emit_mode_unit_size): New function.
        (emit_mode_unit_precision): New function.
        (emit_mode_adjustments): Add mode_unit_size adjustments.
        (emit_insn_modes_c): Emit new arrays.
        * machmode.h (GET_MODE_UNIT_SIZE, GET_MODE_UNIT_PRECISION): Update to
        use new inline methods.

[-- Attachment #2: mode_inner4.patch --]
[-- Type: application/octet-stream, Size: 6336 bytes --]

diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index f4db427..a633f67 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -1047,6 +1047,79 @@ mode_inner_inline (machine_mode mode)\n\
 }\n");
 }
 
+/* Emit mode_unit_size_inline routine into insn-modes.h header.  */
+static void
+emit_mode_unit_size_inline (void)
+{
+  int c;
+  struct mode_data *m;
+
+  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_inline (machine_mode mode)\n\
+{\n\
+  extern unsigned char mode_unit_size[NUM_MACHINE_MODES];\n\
+  switch (mode)\n\
+    {");
+
+  for_all_modes (c, m)
+    {
+      const char *name = m->name;
+      struct mode_data *m2 = m;
+      if (c != MODE_PARTIAL_INT && m2->component)
+	m2 = m2->component;
+      if (!m2->need_bytesize_adj)
+	printf ("    case %smode: return %u;\n", name, m2->bytesize);
+    }
+
+  puts ("\
+    default: return mode_unit_size[mode];\n\
+    }\n\
+}\n");
+}
+
+/* Emit mode_unit_precision_inline routine into insn-modes.h header.  */
+static void
+emit_mode_unit_precision_inline (void)
+{
+  int c;
+  struct mode_data *m;
+
+  puts ("\
+#ifdef __cplusplus\n\
+inline __attribute__((__always_inline__))\n\
+#else\n\
+extern __inline__ __attribute__((__always_inline__, __gnu_inline__))\n\
+#endif\n\
+unsigned short\n\
+mode_unit_precision_inline (machine_mode mode)\n\
+{\n\
+  extern const unsigned short mode_unit_precision[NUM_MACHINE_MODES];\n\
+  switch (mode)\n\
+    {");
+
+  for_all_modes (c, m)
+    {
+      struct mode_data *m2
+	= (c != MODE_PARTIAL_INT && m->component) ? m->component : m;
+      if (m2->precision != (unsigned int)-1)
+	printf ("    case %smode: return %u;\n", m->name, m2->precision);
+      else
+	printf ("    case %smode: return %u*BITS_PER_UNIT;\n",
+		m->name, m2->bytesize);
+    }
+
+  puts ("\
+    default: return mode_unit_precision[mode];\n\
+    }\n\
+}\n");
+}
+
 static void
 emit_insn_modes_h (void)
 {
@@ -1107,6 +1180,7 @@ enum machine_mode\n{");
 
   /* I can't think of a better idea, can you?  */
   printf ("#define CONST_MODE_SIZE%s\n", adj_bytesize ? "" : " const");
+  printf ("#define CONST_MODE_UNIT_SIZE%s\n", adj_bytesize ? "" : " const");
   printf ("#define CONST_MODE_BASE_ALIGN%s\n", adj_alignment ? "" : " const");
 #if 0 /* disabled for backward compatibility, temporary */
   printf ("#define CONST_REAL_FORMAT_FOR_MODE%s\n", adj_format ? "" :" const");
@@ -1125,6 +1199,8 @@ enum machine_mode\n{");
   emit_mode_size_inline ();
   emit_mode_nunits_inline ();
   emit_mode_inner_inline ();
+  emit_mode_unit_size_inline ();
+  emit_mode_unit_precision_inline ();
   puts ("#endif /* GCC_VERSION >= 4001 */");
 
   puts ("\
@@ -1345,6 +1421,45 @@ emit_mode_inner (void)
 }
 
 static void
+emit_mode_unit_size (void)
+{
+  int c;
+  struct mode_data *m;
+
+  print_maybe_const_decl ("%sunsigned char", "mode_unit_size",
+			  "NUM_MACHINE_MODES", bytesize);
+
+  for_all_modes (c, m)
+    tagged_printf ("%u",
+		   c != MODE_PARTIAL_INT && m->component
+		   ? m->component->bytesize : m->bytesize, m->name);
+
+  print_closer ();
+}
+
+static void
+emit_mode_unit_precision (void)
+{
+  int c;
+  struct mode_data *m;
+
+  print_decl ("unsigned short", "mode_unit_precision", "NUM_MACHINE_MODES");
+
+  for_all_modes (c, m)
+    {
+      struct mode_data *m2 = (c != MODE_PARTIAL_INT && m->component) ?
+			     m->component : m;
+      if (m2->precision != (unsigned int)-1)
+	tagged_printf ("%u", m2->precision, m->name);
+      else
+	tagged_printf ("%u*BITS_PER_UNIT", m2->bytesize, m->name);
+    }
+
+  print_closer ();
+}
+
+
+static void
 emit_mode_base_align (void)
 {
   int c;
@@ -1439,6 +1554,7 @@ emit_mode_adjustments (void)
       printf ("\n  /* %s:%d */\n  s = %s;\n",
 	      a->file, a->line, a->adjustment);
       printf ("  mode_size[%smode] = s;\n", a->mode->name);
+      printf ("  mode_unit_size[%smode] = s;\n", a->mode->name);
       printf ("  mode_base_align[%smode] = s & (~s + 1);\n",
 	      a->mode->name);
 
@@ -1449,6 +1565,7 @@ emit_mode_adjustments (void)
 	    case MODE_COMPLEX_INT:
 	    case MODE_COMPLEX_FLOAT:
 	      printf ("  mode_size[%smode] = 2*s;\n", m->name);
+	      printf ("  mode_unit_size[%smode] = s;\n", m->name);
 	      printf ("  mode_base_align[%smode] = s & (~s + 1);\n",
 		      m->name);
 	      break;
@@ -1461,6 +1578,7 @@ emit_mode_adjustments (void)
 	    case MODE_VECTOR_UACCUM:
 	      printf ("  mode_size[%smode] = %d*s;\n",
 		      m->name, m->ncomponents);
+	      printf ("  mode_unit_size[%smode] = s;\n", m->name);
 	      printf ("  mode_base_align[%smode] = (%d*s) & (~(%d*s)+1);\n",
 		      m->name, m->ncomponents, m->ncomponents);
 	      break;
@@ -1626,6 +1744,8 @@ emit_insn_modes_c (void)
   emit_mode_wider ();
   emit_mode_mask ();
   emit_mode_inner ();
+  emit_mode_unit_size ();
+  emit_mode_unit_precision ();
   emit_mode_base_align ();
   emit_class_narrowest_mode ();
   emit_real_format_for_mode ();
diff --git a/gcc/machmode.h b/gcc/machmode.h
index c6b4064..49a01fc 100644
--- a/gcc/machmode.h
+++ b/gcc/machmode.h
@@ -223,12 +223,28 @@ extern const unsigned char mode_inner[NUM_MACHINE_MODES];
 /* Get the size in bytes or bites of the basic parts of an
    object of mode MODE.  */
 
-#define GET_MODE_UNIT_SIZE(MODE) GET_MODE_SIZE (GET_MODE_INNER (MODE))
+extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];
+#if GCC_VERSION >= 4001
+#define GET_MODE_UNIT_SIZE(MODE) \
+  ((unsigned char) (__builtin_constant_p (MODE) \
+		   ? mode_unit_size_inline (MODE) : mode_unit_size[MODE]))
+#else
+#define GET_MODE_UNIT_SIZE(MODE) mode_unit_size[MODE]
+#endif
 
 #define GET_MODE_UNIT_BITSIZE(MODE) \
   ((unsigned short) (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT))
 
-#define GET_MODE_UNIT_PRECISION(MODE) GET_MODE_PRECISION (GET_MODE_INNER (MODE))
+extern const unsigned short mode_unit_precision[NUM_MACHINE_MODES];
+#if GCC_VERSION >= 4001
+#define GET_MODE_UNIT_PRECISION(MODE) \
+  ((unsigned short) (__builtin_constant_p (MODE) \
+		    ? mode_unit_precision_inline (MODE)\
+		    : mode_unit_precision[MODE]))
+#else
+#define GET_MODE_UNIT_PRECISION(MODE) mode_unit_precision[MODE]
+#endif
+
 
 /* Get the number of units in the object.  */
 

^ permalink raw reply	[flat|nested] 10+ messages in thread
* RE: [PATCH][4/N] Introduce new inline functions for GET_MODE_UNIT_SIZE and GET_MODE_UNIT_PRECISION
@ 2015-09-01 12:45 David Sherwood
  0 siblings, 0 replies; 10+ messages in thread
From: David Sherwood @ 2015-09-01 12:45 UTC (permalink / raw)
  To: 'Jeff Law', Oleg Endo; +Cc: GCC Patches

Hi,

Fix/patch committed.

Tested:

x86_64-linux: bootstrap built fine, no regressions
aarch64-none-elf: no regressions
sh-elf crossbuild: builds fine

ChangeLog:

2015-09-01  David Sherwood  <david.sherwood@arm.com>

    gcc/
        * genmodes.c: Add CONST_MODE_UNIT_SIZE modifier.

Thanks,
David.

> -----Original Message-----
> From: Jeff Law [mailto:law@redhat.com]
> Sent: 01 September 2015 07:02
> To: Oleg Endo
> Cc: David Sherwood; GCC Patches
> Subject: Re: [PATCH][4/N] Introduce new inline functions for GET_MODE_UNIT_SIZE and
> GET_MODE_UNIT_PRECISION
> 
> On 08/26/2015 08:53 AM, Oleg Endo wrote:
> >
> > On 26 Aug 2015, at 23:27, Oleg Endo <oleg.endo@t-online.de> wrote:
> >
> >>
> >> On 19 Aug 2015, at 22:35, Jeff Law <law@redhat.com> wrote:
> >>
> >>> On 08/19/2015 06:29 AM, David Sherwood wrote:
> >>>>> I asked Richard S. to give this a once-over which he did.  However, he
> >>>>> technically can't approve due to the way his maintainership position was
> >>>>> worded.
> >>>>>
> >>>>> The one request would be a function comment for emit_mode_unit_size and
> >>>>> emit_mode_unit_precision.  OK with that change.
> >>>> Thanks. Here's a new patch with the comments added.
> >>>>
> >>>> Good to go?
> >>>> David.
> >>>>
> >>>> ChangeLog:
> >>>>
> >>>> 2015-08-19  David Sherwood  <david.sherwood@arm.com>
> >>>>
> >>>> 	gcc/
> >>>> 	* genmodes.c (emit_mode_unit_size_inline): New function.
> >>>> 	(emit_mode_unit_precision_inline): New function.
> >>>> 	(emit_insn_modes_h): Emit new #define.  Emit new functions.
> >>>> 	(emit_mode_unit_size): New function.
> >>>> 	(emit_mode_unit_precision): New function.
> >>>> 	(emit_mode_adjustments): Add mode_unit_size adjustments.
> >>>> 	(emit_insn_modes_c): Emit new arrays.
> >>>> 	* machmode.h (GET_MODE_UNIT_SIZE, GET_MODE_UNIT_PRECISION): Update to
> >>>> 	use new inline methods.
> >>>
> >>> Thanks, this is OK for the trunk.
> >>
> >> It seems this broke sh-elf, at least when compiling on OSX with its native clang.
> >>
> >> ../../gcc-trunk/gcc/machmode.h:228:43: error: redefinition of 'mode_unit_size' with a different
type:
> >>       'const unsigned char [56]' vs 'unsigned char [56]'
> >> extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];
> >>                                           ^
> >> ./insn-modes.h:417:24: note: previous definition is here
> >>   extern unsigned char mode_unit_size[NUM_MACHINE_MODES];
> >>                        ^
> >
> > This following fixes the problem for me:
> >
> > Index: gcc/genmodes.c
> > ===================================================================
> > --- gcc/genmodes.c	(revision 227221)
> > +++ gcc/genmodes.c	(working copy)
> > @@ -1063,7 +1063,7 @@
> >   unsigned char\n\
> >   mode_unit_size_inline (machine_mode mode)\n\
> >   {\n\
> > -  extern unsigned char mode_unit_size[NUM_MACHINE_MODES];\n\
> > +  extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];\n\
> >     switch (mode)\n\
> >       {");
> OK with the usual testing.
> 
> jeff



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2015-09-01 12:45 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-17 11:52 [PATCH][4/N] Introduce new inline functions for GET_MODE_UNIT_SIZE and GET_MODE_UNIT_PRECISION David Sherwood
2015-08-18 19:26 ` Jeff Law
2015-08-19 12:35   ` David Sherwood
2015-08-19 13:41     ` Jeff Law
2015-08-26 14:34       ` Oleg Endo
2015-08-26 14:54         ` Oleg Endo
2015-08-27  7:59           ` David Sherwood
2015-08-27 12:26             ` Oleg Endo
2015-09-01  6:01           ` Jeff Law
2015-09-01 12:45 David Sherwood

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).