Patchwork [avr] Tidy builtins.def

login
register
mail settings
Submitter Georg-Johann Lay
Date Jan. 15, 2013, 2:54 p.m.
Message ID <50F56DAD.6030002@gjlay.de>
Download mbox | patch
Permalink /patch/212204/
State New
Headers show

Comments

Georg-Johann Lay - Jan. 15, 2013, 2:54 p.m.
This patch factors out stuff from builtins.def that is used again and again.
Strings like the "__builtin_avr_" common to all builtins is moved to the
implementation of DEF_BUILTIN.

Similar for ICODE and CODE_FOR_.

ID is no more needed, the needed enums are derived from NAME.

There is no functional change, the only purpose is an easier and better
legibility of builtins.def and reduced redundancies.

Lightly tested.

Ok for trunk?

Johann


	* config/avr/builtins.def (DEF_BUILTIN): Factor out "__builtin_avr_"
	from NAME and turn NAME to an uppercase identifier.
	Factor out 'CODE_FOR_' from ICODE, use 'nothing' instead of '-1'.
	Remove ID.  Adjust comments.
	* config/avr/avr-c.c (avr_builtin_name): Remove.
	(avr_cpu_cpp_builtins): Use DEF_BUILTIN instead of for-loop.
	* config/avr/avr.c (avr_tolower): New static function.
	(DEF_BUILTIN): Remove parameter ID.  Prefix ICODE by 'CODE_FOR_'.
	Stringify NAME, prefix it with "__builtin_avr_" and lowercase it.
	(avr_expand_builtin): Assert insn_code != CODE_FOR_nothing for
	default expansion.

Patch

Index: config/avr/builtins.def
===================================================================
--- config/avr/builtins.def	(revision 195159)
+++ config/avr/builtins.def	(working copy)
@@ -20,35 +20,35 @@ 
    builtins defined in the AVR part of the GNU compiler.
    Befor including this file, define a macro
 
-   DEF_BUILTIN(NAME, N_ARGS, ID, TYPE, ICODE)
+   DEF_BUILTIN(NAME, N_ARGS, TYPE, ICODE)
 
-   NAME:   The name as visible by the user as a C string.
+   NAME:   `__builtin_avr_name' will be the user-level name of the builtin.
+           `AVR_BUILTIN_NAME' will be the internal builtin's id.
    N_ARGS: Number of input arguments.  If special treatment is needed,
            set to -1 and handle it by hand, see avr.c:avr_expand_builtin().
-   ID:     An integer to identify the built-in.
    TYPE:   A tree node describing the prototype of the built-in.
-   ICODE:  Insn code number for the insn attached to the built-in.
-           If special treatment is needed to expand the built-in, set to -1.
+   ICODE:  Name of attached insn or expander.  If special treatment in avr.c
+           is needed to expand the built-in, use `nothing'.
 */
 
 /* Mapped to respective instruction.  */
 
-DEF_BUILTIN ("__builtin_avr_nop",  -1, AVR_BUILTIN_NOP, void_ftype_void, -1)
-DEF_BUILTIN ("__builtin_avr_sei",   0, AVR_BUILTIN_SEI, void_ftype_void, CODE_FOR_enable_interrupt)
-DEF_BUILTIN ("__builtin_avr_cli",   0, AVR_BUILTIN_CLI, void_ftype_void, CODE_FOR_disable_interrupt)
-DEF_BUILTIN ("__builtin_avr_wdr",   0, AVR_BUILTIN_WDR,   void_ftype_void, CODE_FOR_wdr)
-DEF_BUILTIN ("__builtin_avr_sleep", 0, AVR_BUILTIN_SLEEP, void_ftype_void, CODE_FOR_sleep)
+DEF_BUILTIN (NOP,  -1, void_ftype_void, nothing)
+DEF_BUILTIN (SEI,   0, void_ftype_void, enable_interrupt)
+DEF_BUILTIN (CLI,   0, void_ftype_void, disable_interrupt)
+DEF_BUILTIN (WDR,   0, void_ftype_void, wdr)
+DEF_BUILTIN (SLEEP, 0, void_ftype_void, sleep)
 
 /* Mapped to respective instruction but might also be folded away
    or emit as libgcc call if ISA does not provide the instruction.  */
 
-DEF_BUILTIN ("__builtin_avr_swap",   1, AVR_BUILTIN_SWAP,   uchar_ftype_uchar,      CODE_FOR_rotlqi3_4)
-DEF_BUILTIN ("__builtin_avr_fmul",   2, AVR_BUILTIN_FMUL,   uint_ftype_uchar_uchar, CODE_FOR_fmul)
-DEF_BUILTIN ("__builtin_avr_fmuls",  2, AVR_BUILTIN_FMULS,  int_ftype_char_char,    CODE_FOR_fmuls)
-DEF_BUILTIN ("__builtin_avr_fmulsu", 2, AVR_BUILTIN_FMULSU, int_ftype_char_uchar,   CODE_FOR_fmulsu)
+DEF_BUILTIN (SWAP,   1, uchar_ftype_uchar,      rotlqi3_4)
+DEF_BUILTIN (FMUL,   2, uint_ftype_uchar_uchar, fmul)
+DEF_BUILTIN (FMULS,  2, int_ftype_char_char,    fmuls)
+DEF_BUILTIN (FMULSU, 2, int_ftype_char_uchar,   fmulsu)
 
 /* More complex stuff that cannot be mapped 1:1 to an instruction.  */
 
-DEF_BUILTIN ("__builtin_avr_delay_cycles", -1, AVR_BUILTIN_DELAY_CYCLES, void_ftype_ulong, -1)
-DEF_BUILTIN ("__builtin_avr_insert_bits", 3, AVR_BUILTIN_INSERT_BITS, uchar_ftype_ulong_uchar_uchar, CODE_FOR_insert_bits)
-DEF_BUILTIN ("__builtin_avr_flash_segment", 1, AVR_BUILTIN_FLASH_SEGMENT, char_ftype_const_memx_ptr, CODE_FOR_flash_segment)
+DEF_BUILTIN (DELAY_CYCLES, -1, void_ftype_ulong, nothing)
+DEF_BUILTIN (INSERT_BITS, 3, uchar_ftype_ulong_uchar_uchar, insert_bits)
+DEF_BUILTIN (FLASH_SEGMENT, 1, char_ftype_const_memx_ptr, flash_segment)
Index: config/avr/avr-c.c
===================================================================
--- config/avr/avr-c.c	(revision 195169)
+++ config/avr/avr-c.c	(working copy)
@@ -70,14 +70,6 @@  avr_toupper (char *up, const char *lo)
 
 /* Worker function for TARGET_CPU_CPP_BUILTINS.  */
 
-static const char *const avr_builtin_name[] =
-  {
-#define DEF_BUILTIN(NAME, N_ARGS, ID, TYPE, CODE) NAME,
-#include "builtins.def"
-#undef DEF_BUILTIN
-    NULL
-  };
-
 void
 avr_cpu_cpp_builtins (struct cpp_reader *pfile)
 {
@@ -176,13 +168,10 @@  avr_cpu_cpp_builtins (struct cpp_reader
   /* Define builtin macros so that the user can easily query whether or
      not a specific builtin is available. */
 
-  for (i = 0; avr_builtin_name[i]; i++)
-    {
-      const char *name = avr_builtin_name[i];
-      char *Name = (char*) alloca (1 + strlen (name));
-
-      cpp_define (pfile, avr_toupper (Name, name));
-    }
+#define DEF_BUILTIN(NAME, N_ARGS, TYPE, CODE)   \
+  cpp_define (pfile, "__BUILTIN_AVR_" #NAME);
+#include "builtins.def"
+#undef DEF_BUILTIN
 
   /* Builtin macros for the __int24 and __uint24 type.  */
 
Index: config/avr/avr.c
===================================================================
--- config/avr/avr.c	(revision 195160)
+++ config/avr/avr.c	(working copy)
@@ -205,6 +205,22 @@  bool avr_need_clear_bss_p = false;
 bool avr_need_copy_data_p = false;
 
 
+/* Transform UP into lowercase and write the result to LO.
+   You must provide enough space for LO.  Return LO.  */
+
+static char*
+avr_tolower (char *lo, const char *up)
+{
+  char *lo0 = lo;
+
+  for (; *up; up++, lo++)
+    *lo = TOLOWER (*up);
+
+  *lo = '\0';
+
+  return lo0;
+}
+
 
 /* Custom function to count number of set bits.  */
 
@@ -11368,7 +11384,8 @@  avr_out_insert_bits (rtx *op, int *plen)
 
 enum avr_builtin_id
   {
-#define DEF_BUILTIN(NAME, N_ARGS, ID, TYPE, CODE) ID,
+#define DEF_BUILTIN(NAME, N_ARGS, TYPE, CODE)   \
+    AVR_BUILTIN_ ## NAME,
 #include "builtins.def"
 #undef DEF_BUILTIN
 
@@ -11378,7 +11395,6 @@  enum avr_builtin_id
 struct GTY(()) avr_builtin_description
 {
   enum insn_code icode;
-  const char *name;
   int n_args;
   tree fndecl;
 };
@@ -11391,9 +11407,8 @@  struct GTY(()) avr_builtin_description
 static GTY(()) struct avr_builtin_description
 avr_bdesc[AVR_BUILTIN_COUNT] =
   {
-
-#define DEF_BUILTIN(NAME, N_ARGS, ID, TYPE, ICODE)      \
-    { (enum insn_code) ICODE, NAME, N_ARGS, NULL_TREE },
+#define DEF_BUILTIN(NAME, N_ARGS, TYPE, ICODE)                  \
+    { (enum insn_code) CODE_FOR_ ## ICODE, N_ARGS, NULL_TREE },
 #include "builtins.def"
 #undef DEF_BUILTIN
   };
@@ -11474,10 +11489,17 @@  avr_init_builtins (void)
                                   const_memx_ptr_type_node,
                                   NULL);
 
-#define DEF_BUILTIN(NAME, N_ARGS, ID, TYPE, CODE)                       \
-  gcc_assert (ID < AVR_BUILTIN_COUNT);                                  \
-  avr_bdesc[ID].fndecl                                                  \
-    = add_builtin_function (NAME, TYPE, ID, BUILT_IN_MD, NULL, NULL_TREE);
+#define DEF_BUILTIN(NAME, N_ARGS, TYPE, CODE)                           \
+  {                                                                     \
+    int id = AVR_BUILTIN_ ## NAME;                                      \
+    const char *Name = "__builtin_avr_" #NAME;                          \
+    char *name = (char*) alloca (1 + strlen (Name));                    \
+                                                                        \
+    gcc_assert (id < AVR_BUILTIN_COUNT);                                \
+    avr_bdesc[id].fndecl                                                \
+      = add_builtin_function (avr_tolower (name, Name), TYPE, id,       \
+                              BUILT_IN_MD, NULL, NULL_TREE);            \
+  }
 #include "builtins.def"
 #undef DEF_BUILTIN
 
@@ -11604,6 +11626,7 @@  avr_expand_builtin (tree exp, rtx target
 
   /* No special treatment needed: vanilla expand.  */
 
+  gcc_assert (d->icode != CODE_FOR_nothing);
   gcc_assert (d->n_args == call_expr_nargs (exp));
 
   if (d->n_args == 0)