Commit e52a8b71 by Georg-Johann Lay Committed by Georg-Johann Lay

builtins.def (DEF_BUILTIN): Factor out "__builtin_avr_" from NAME, turn NAME to…

builtins.def (DEF_BUILTIN): Factor out "__builtin_avr_" from NAME, turn NAME to an uppercase identifier.

	* config/avr/builtins.def (DEF_BUILTIN): Factor out
	"__builtin_avr_" from NAME, 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.

From-SVN: r195276
parent 610fb637
2013-01-17 Georg-Johann Lay <avr@gjlay.de>
* config/avr/builtins.def (DEF_BUILTIN): Factor out
"__builtin_avr_" from NAME, 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.
2013-01-17 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55273
......
......@@ -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 *pfile)
/* 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. */
......
......@@ -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)
......
......@@ -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)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment