===================================================================
@@ -51,7 +51,6 @@
/* Maximal allowed offset for an address in the LD command */
#define MAX_LD_OFFSET(MODE) (64 - (signed)GET_MODE_SIZE (MODE))
-static void avr_option_override (void);
static int avr_naked_function_p (tree);
static int interrupt_function_p (tree);
static int signal_function_p (tree);
@@ -63,52 +62,12 @@ static int sequent_regs_live (void);
static const char *ptrreg_to_str (int);
static const char *cond_string (enum rtx_code);
static int avr_num_arg_regs (enum machine_mode, const_tree);
-
static RTX_CODE compare_condition (rtx insn);
-static rtx avr_legitimize_address (rtx, rtx, enum machine_mode);
static int compare_sign_p (rtx insn);
static tree avr_handle_progmem_attribute (tree *, tree, tree, int, bool *);
static tree avr_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
static tree avr_handle_fntype_attribute (tree *, tree, tree, int, bool *);
-static bool avr_assemble_integer (rtx, unsigned int, int);
-static void avr_file_start (void);
-static void avr_file_end (void);
-static bool avr_legitimate_address_p (enum machine_mode, rtx, bool);
-static void avr_asm_function_end_prologue (FILE *);
-static void avr_asm_function_begin_epilogue (FILE *);
-static bool avr_cannot_modify_jumps_p (void);
-static rtx avr_function_value (const_tree, const_tree, bool);
-static rtx avr_libcall_value (enum machine_mode, const_rtx);
-static bool avr_function_value_regno_p (const unsigned int);
-static void avr_insert_attributes (tree, tree *);
-static void avr_asm_init_sections (void);
-static unsigned int avr_section_type_flags (tree, const char *, int);
-
-static void avr_reorg (void);
-static void avr_asm_out_ctor (rtx, int);
-static void avr_asm_out_dtor (rtx, int);
-static int avr_register_move_cost (enum machine_mode, reg_class_t, reg_class_t);
-static int avr_memory_move_cost (enum machine_mode, reg_class_t, bool);
static int avr_operand_rtx_cost (rtx, enum machine_mode, enum rtx_code, bool);
-static bool avr_rtx_costs (rtx, int, int, int *, bool);
-static int avr_address_cost (rtx, bool);
-static bool avr_return_in_memory (const_tree, const_tree);
-static struct machine_function * avr_init_machine_status (void);
-static void avr_init_builtins (void);
-static rtx avr_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
-static rtx avr_builtin_setjmp_frame_value (void);
-static bool avr_hard_regno_scratch_ok (unsigned int);
-static unsigned int avr_case_values_threshold (void);
-static bool avr_frame_pointer_required_p (void);
-static bool avr_can_eliminate (const int, const int);
-static bool avr_class_likely_spilled_p (reg_class_t c);
-static rtx avr_function_arg (cumulative_args_t , enum machine_mode,
- const_tree, bool);
-static void avr_function_arg_advance (cumulative_args_t, enum machine_mode,
- const_tree, bool);
-static bool avr_function_ok_for_sibcall (tree, tree);
-static void avr_asm_named_section (const char *name, unsigned int flags, tree decl);
-static void avr_encode_section_info (tree, rtx, int);
/* Allocate registers from r25 to r8 for parameters for function calls. */
#define FIRST_CUM_REG 26
@@ -119,9 +78,6 @@ static GTY(()) rtx tmp_reg_rtx;
/* Zeroed register RTX (gen_rtx_REG (QImode, ZERO_REGNO)) */
static GTY(()) rtx zero_reg_rtx;
-/* AVR register names {"r0", "r1", ..., "r31"} */
-static const char *const avr_regnames[] = REGISTER_NAMES;
-
/* Preprocessor macros to define depending on MCU type. */
const char *avr_extra_arch_macro;
@@ -157,111 +113,17 @@ static const struct attribute_spec avr_a
{ NULL, 0, 0, false, false, false, NULL, false }
};
-/* Initialize the GCC target structure. */
-#undef TARGET_ASM_ALIGNED_HI_OP
-#define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
-#undef TARGET_ASM_ALIGNED_SI_OP
-#define TARGET_ASM_ALIGNED_SI_OP "\t.long\t"
-#undef TARGET_ASM_UNALIGNED_HI_OP
-#define TARGET_ASM_UNALIGNED_HI_OP "\t.word\t"
-#undef TARGET_ASM_UNALIGNED_SI_OP
-#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
-#undef TARGET_ASM_INTEGER
-#define TARGET_ASM_INTEGER avr_assemble_integer
-#undef TARGET_ASM_FILE_START
-#define TARGET_ASM_FILE_START avr_file_start
-#undef TARGET_ASM_FILE_END
-#define TARGET_ASM_FILE_END avr_file_end
-
-#undef TARGET_ASM_FUNCTION_END_PROLOGUE
-#define TARGET_ASM_FUNCTION_END_PROLOGUE avr_asm_function_end_prologue
-#undef TARGET_ASM_FUNCTION_BEGIN_EPILOGUE
-#define TARGET_ASM_FUNCTION_BEGIN_EPILOGUE avr_asm_function_begin_epilogue
-
-#undef TARGET_FUNCTION_VALUE
-#define TARGET_FUNCTION_VALUE avr_function_value
-#undef TARGET_LIBCALL_VALUE
-#define TARGET_LIBCALL_VALUE avr_libcall_value
-#undef TARGET_FUNCTION_VALUE_REGNO_P
-#define TARGET_FUNCTION_VALUE_REGNO_P avr_function_value_regno_p
-
-#undef TARGET_ATTRIBUTE_TABLE
-#define TARGET_ATTRIBUTE_TABLE avr_attribute_table
-#undef TARGET_ASM_FUNCTION_RODATA_SECTION
-#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
-#undef TARGET_INSERT_ATTRIBUTES
-#define TARGET_INSERT_ATTRIBUTES avr_insert_attributes
-#undef TARGET_SECTION_TYPE_FLAGS
-#define TARGET_SECTION_TYPE_FLAGS avr_section_type_flags
-
-/* `TARGET_ASM_NAMED_SECTION' must be defined in avr.h. */
-
-#undef TARGET_ASM_INIT_SECTIONS
-#define TARGET_ASM_INIT_SECTIONS avr_asm_init_sections
-#undef TARGET_ENCODE_SECTION_INFO
-#define TARGET_ENCODE_SECTION_INFO avr_encode_section_info
-
-#undef TARGET_REGISTER_MOVE_COST
-#define TARGET_REGISTER_MOVE_COST avr_register_move_cost
-#undef TARGET_MEMORY_MOVE_COST
-#define TARGET_MEMORY_MOVE_COST avr_memory_move_cost
-#undef TARGET_RTX_COSTS
-#define TARGET_RTX_COSTS avr_rtx_costs
-#undef TARGET_ADDRESS_COST
-#define TARGET_ADDRESS_COST avr_address_cost
-#undef TARGET_MACHINE_DEPENDENT_REORG
-#define TARGET_MACHINE_DEPENDENT_REORG avr_reorg
-#undef TARGET_FUNCTION_ARG
-#define TARGET_FUNCTION_ARG avr_function_arg
-#undef TARGET_FUNCTION_ARG_ADVANCE
-#define TARGET_FUNCTION_ARG_ADVANCE avr_function_arg_advance
-
-#undef TARGET_LEGITIMIZE_ADDRESS
-#define TARGET_LEGITIMIZE_ADDRESS avr_legitimize_address
-
-#undef TARGET_RETURN_IN_MEMORY
-#define TARGET_RETURN_IN_MEMORY avr_return_in_memory
-
-#undef TARGET_STRICT_ARGUMENT_NAMING
-#define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
-
-#undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
-#define TARGET_BUILTIN_SETJMP_FRAME_VALUE avr_builtin_setjmp_frame_value
-
-#undef TARGET_HARD_REGNO_SCRATCH_OK
-#define TARGET_HARD_REGNO_SCRATCH_OK avr_hard_regno_scratch_ok
-#undef TARGET_CASE_VALUES_THRESHOLD
-#define TARGET_CASE_VALUES_THRESHOLD avr_case_values_threshold
-
-#undef TARGET_LEGITIMATE_ADDRESS_P
-#define TARGET_LEGITIMATE_ADDRESS_P avr_legitimate_address_p
-
-#undef TARGET_FRAME_POINTER_REQUIRED
-#define TARGET_FRAME_POINTER_REQUIRED avr_frame_pointer_required_p
-#undef TARGET_CAN_ELIMINATE
-#define TARGET_CAN_ELIMINATE avr_can_eliminate
-
-#undef TARGET_CLASS_LIKELY_SPILLED_P
-#define TARGET_CLASS_LIKELY_SPILLED_P avr_class_likely_spilled_p
-
-#undef TARGET_OPTION_OVERRIDE
-#define TARGET_OPTION_OVERRIDE avr_option_override
-
-#undef TARGET_CANNOT_MODIFY_JUMPS_P
-#define TARGET_CANNOT_MODIFY_JUMPS_P avr_cannot_modify_jumps_p
+/* Implement `TARGET_INIT_MACHINE_STATUS'. */
-#undef TARGET_FUNCTION_OK_FOR_SIBCALL
-#define TARGET_FUNCTION_OK_FOR_SIBCALL avr_function_ok_for_sibcall
-
-#undef TARGET_INIT_BUILTINS
-#define TARGET_INIT_BUILTINS avr_init_builtins
+static struct machine_function *
+avr_init_machine_status (void)
+{
+ return ggc_alloc_cleared_machine_function ();
+}
-#undef TARGET_EXPAND_BUILTIN
-#define TARGET_EXPAND_BUILTIN avr_expand_builtin
+/* Implement `TARGET_OPTION_OVERRIDE'. */
-struct gcc_target targetm = TARGET_INITIALIZER;
-
static void
avr_option_override (void)
{
@@ -277,36 +139,31 @@ avr_option_override (void)
init_machine_status = avr_init_machine_status;
}
-/* return register class from register number. */
-
-static const enum reg_class reg_class_tab[]={
- GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,
- GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,
- GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,GENERAL_REGS,
- GENERAL_REGS, /* r0 - r15 */
- LD_REGS,LD_REGS,LD_REGS,LD_REGS,LD_REGS,LD_REGS,LD_REGS,
- LD_REGS, /* r16 - 23 */
- ADDW_REGS,ADDW_REGS, /* r24,r25 */
- POINTER_X_REGS,POINTER_X_REGS, /* r26,27 */
- POINTER_Y_REGS,POINTER_Y_REGS, /* r28,r29 */
- POINTER_Z_REGS,POINTER_Z_REGS, /* r30,r31 */
- STACK_REG,STACK_REG /* SPL,SPH */
-};
-
-/* Function to set up the backend function structure. */
-
-static struct machine_function *
-avr_init_machine_status (void)
-{
- return ggc_alloc_cleared_machine_function ();
-}
+/* Implement `REGNO_REG_CLASS'. */
/* Return register class for register R. */
enum reg_class
avr_regno_reg_class (int r)
{
- if (r <= 33)
+ static const enum reg_class reg_class_tab[] =
+ {
+ /* r0 - r15 */
+ NO_LD_REGS, NO_LD_REGS, NO_LD_REGS, NO_LD_REGS,
+ NO_LD_REGS, NO_LD_REGS, NO_LD_REGS, NO_LD_REGS,
+ NO_LD_REGS, NO_LD_REGS, NO_LD_REGS, NO_LD_REGS,
+ NO_LD_REGS, NO_LD_REGS, NO_LD_REGS, NO_LD_REGS,
+ /* r16 - 23 */
+ SIMPLE_LD_REGS, SIMPLE_LD_REGS, SIMPLE_LD_REGS, SIMPLE_LD_REGS,
+ SIMPLE_LD_REGS, SIMPLE_LD_REGS, SIMPLE_LD_REGS, SIMPLE_LD_REGS,
+ ADDW_REGS, ADDW_REGS, /* r24,r25 */
+ POINTER_X_REGS, POINTER_X_REGS, /* r26,r27 */
+ POINTER_Y_REGS, POINTER_Y_REGS, /* r28,r29 */
+ POINTER_Z_REGS, POINTER_Z_REGS, /* r30,r31 */
+ STACK_REG, STACK_REG /* SPL,SPH */
+ };
+
+ if (r <= 33)
return reg_class_tab[r];
return ALL_REGS;
}
@@ -417,9 +274,11 @@ avr_regs_to_save (HARD_REG_SET *set)
return count;
}
+
+/* Implement `TARGET_CAN_ELIMINATE'. */
/* Return true if register FROM can be eliminated via register TO. */
-bool
+static bool
avr_can_eliminate (const int from, const int to)
{
return ((from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
@@ -428,6 +287,8 @@ avr_can_eliminate (const int from, const
&& !frame_pointer_needed));
}
+
+/* Implement `INITIAL_ELIMINATION_OFFSET'. */
/* Compute offset between arg_pointer and frame_pointer. */
int
@@ -445,17 +306,22 @@ avr_initial_elimination_offset (int from
}
}
+
+/* Implement `TARGET_BUILTIN_SETJMP_FRAME_VALUE'. */
/* Actual start of frame is virtual_stack_vars_rtx this is offset from
frame pointer by +STARTING_FRAME_OFFSET.
Using saved frame = virtual_stack_vars_rtx - STARTING_FRAME_OFFSET
avoids creating add/sub of offset in nonlocal goto and setjmp. */
-rtx avr_builtin_setjmp_frame_value (void)
+static rtx
+avr_builtin_setjmp_frame_value (void)
{
return gen_rtx_MINUS (Pmode, virtual_stack_vars_rtx,
- gen_int_mode (STARTING_FRAME_OFFSET, Pmode));
+ gen_int_mode (STARTING_FRAME_OFFSET, Pmode));
}
+
+/* Implement `RETURN_ADDR_RTX'. */
/* Return contents of MEM at frame pointer + stack size + 1 (+2 if 3 byte PC).
This is return address of function. */
rtx
@@ -1082,10 +948,11 @@ avr_cannot_modify_jumps_p (void)
}
+/* Implement `TARGET_LEGITIMATE_ADDRESS_P'. */
/* Return nonzero if X (an RTX) is a legitimate memory address on the target
machine for a memory operand of mode MODE. */
-bool
+static bool
avr_legitimate_address_p (enum machine_mode mode, rtx x, bool strict)
{
enum reg_class r = NO_REGS;
@@ -1150,10 +1017,12 @@ avr_legitimate_address_p (enum machine_m
return r == NO_REGS ? 0 : (int)r;
}
+
+/* Implement `TARGET_LEGITIZE_ADDRESS'. */
/* Attempts to replace X with a valid
memory address for an operand of mode MODE */
-rtx
+static rtx
avr_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
{
x = oldx;
@@ -1195,7 +1064,8 @@ ptrreg_to_str (int regno)
case REG_Y: return "Y";
case REG_Z: return "Z";
default:
- output_operand_lossage ("address operand requires constraint for X, Y, or Z register");
+ output_operand_lossage ("address operand requires constraint "
+ "for X, Y, or Z register");
}
return NULL;
}
@@ -1231,6 +1101,8 @@ cond_string (enum rtx_code code)
}
}
+
+/* Implement `PRINT_OPERAND_ADDRESS'. */
/* Output ADDR to FILE as address. */
void
@@ -1257,17 +1129,19 @@ print_operand_address (FILE *file, rtx a
rtx x = addr;
if (GET_CODE (x) == CONST)
x = XEXP (x, 0);
- if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x,1)) == CONST_INT)
+ if (GET_CODE (x) == PLUS
+ && CONST_INT_P (XEXP (x,1)))
{
- /* Assembler gs() will implant word address. Make offset
- a byte offset inside gs() for assembler. This is
+ /* Assembler gs() will implant word address. Make offset
+ a byte offset inside gs() for assembler. This is
needed because the more logical (constant+gs(sym)) is not
- accepted by gas. For 128K and lower devices this is ok. For
- large devices it will create a Trampoline to offset from symbol
- which may not be what the user really wanted. */
+ accepted by gas. For 128K and lower devices this is ok.
+ For large devices it will create a Trampoline to offset
+ from symbol which may not be what the user really wanted. */
fprintf (file, "gs(");
output_addr_const (file, XEXP (x,0));
- fprintf (file,"+" HOST_WIDE_INT_PRINT_DEC ")", 2 * INTVAL (XEXP (x,1)));
+ fprintf (file,"+" HOST_WIDE_INT_PRINT_DEC ")",
+ 2 * INTVAL (XEXP (x,1)));
if (AVR_3_BYTE_PC)
if (warning (0, "pointer offset from symbol maybe incorrect"))
{
@@ -1288,6 +1162,7 @@ print_operand_address (FILE *file, rtx a
}
+/* Implement `PRINT_OPERAND'. */
/* Output X as assembler operand to file FILE. */
void
@@ -1315,7 +1190,7 @@ print_operand (FILE *file, rtx x, int co
else
fprintf (file, reg_names[true_regnum (x) + abcd]);
}
- else if (GET_CODE (x) == CONST_INT)
+ else if (CONST_INT_P (x))
fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) + abcd);
else if (GET_CODE (x) == MEM)
{
@@ -1326,10 +1201,11 @@ print_operand (FILE *file, rtx x, int co
fatal_insn ("bad address, not a constant):", addr);
/* Assembler template with m-code is data - not progmem section */
if (text_segment_operand (addr, VOIDmode))
- if (warning ( 0, "accessing data memory with program memory address"))
+ if (warning (0, "accessing data memory with "
+ "program memory address"))
{
output_addr_const (stderr, addr);
- fprintf(stderr,"\n");
+ fprintf (stderr,"\n");
}
output_addr_const (file, addr);
}
@@ -1366,10 +1242,11 @@ print_operand (FILE *file, rtx x, int co
{
/* Constant progmem address - like used in jmp or call */
if (0 == text_segment_operand (x, VOIDmode))
- if (warning ( 0, "accessing program memory with data memory address"))
+ if (warning (0, "accessing program memory with "
+ "data memory address"))
{
output_addr_const (stderr, x);
- fprintf(stderr,"\n");
+ fprintf (stderr,"\n");
}
/* Use normal symbol for direct address no linker trampoline needed */
output_addr_const (file, x);
@@ -1392,6 +1269,8 @@ print_operand (FILE *file, rtx x, int co
print_operand_address (file, x);
}
+
+/* Implement `NOTICE_UPDATE_CC'. */
/* Update the condition code in the INSN. */
void
@@ -1454,7 +1333,7 @@ notice_update_cc (rtx body ATTRIBUTE_UNU
{
rtx x = XEXP (src, 1);
- if (GET_CODE (x) == CONST_INT
+ if (CONST_INT_P (x)
&& INTVAL (x) > 0
&& INTVAL (x) != 6)
{
@@ -1467,11 +1346,13 @@ notice_update_cc (rtx body ATTRIBUTE_UNU
}
}
+
+/* Implement `CLASS_MAX_NREGS'. */
/* Return maximum number of consecutive registers of
class CLASS needed to hold a value of mode MODE. */
int
-class_max_nregs (enum reg_class rclass ATTRIBUTE_UNUSED,enum machine_mode mode)
+class_max_nregs (enum reg_class rclass ATTRIBUTE_UNUSED, enum machine_mode mode)
{
return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
}
@@ -1610,6 +1491,8 @@ byte_immediate_operand (rtx op, enum mac
&& INTVAL (op) <= 0xff && INTVAL (op) >= 0);
}
+
+/* Implement `FINAL_PRESCAN_INSN'. */
/* Output insn cost for next insn. */
void
@@ -1631,7 +1514,7 @@ avr_simplify_comparison_p (enum machine_
unsigned int max = (mode == QImode ? 0xff :
mode == HImode ? 0xffff :
mode == SImode ? 0xffffffff : 0);
- if (max && op && GET_CODE (x) == CONST_INT)
+ if (max && op && CONST_INT_P (x))
{
if (unsigned_condition (op) != op)
max >>= 1;
@@ -1644,15 +1527,18 @@ avr_simplify_comparison_p (enum machine_
}
+/* Implement `FUNCTION_ARG_REGNO_P'. */
/* Returns nonzero if REGNO is the number of a hard
register in which function arguments are sometimes passed. */
int
-function_arg_regno_p(int r)
+function_arg_regno_p (int r)
{
return (r >= 8 && r <= 25);
}
+
+/* Implement `INIT_CUMULATIVE_ARGS'. */
/* Initializing the variable cum for the state at the beginning
of the argument list. */
@@ -1688,6 +1574,8 @@ avr_num_arg_regs (enum machine_mode mode
return (size + 1) & ~1;
}
+
+/* Implement `TARGET_FUNCTION_ARG'. */
/* Controls whether a function argument is passed
in a register, and which register. */
@@ -1704,6 +1592,8 @@ avr_function_arg (cumulative_args_t cum_
return NULL_RTX;
}
+
+/* Implement `TARGET_FUNCTION_ARG_ADVANCE'. */
/* Update the summarizer variable CUM to advance past an argument
in the argument list. */
@@ -1848,7 +1738,7 @@ output_movqi (rtx insn, rtx operands[],
if (test_hard_reg_class (LD_REGS, dest)) /* ldi d,i */
return AS2 (ldi,%0,lo8(%1));
- if (GET_CODE (src) == CONST_INT)
+ if (CONST_INT_P (src))
{
if (src == const0_rtx) /* mov r,L */
return AS1 (clr,%0);
@@ -1970,7 +1860,7 @@ output_movhi (rtx insn, rtx operands[],
AS2 (ldi,%B0,hi8(%1)));
}
- if (GET_CODE (src) == CONST_INT)
+ if (CONST_INT_P (src))
{
if (src == const0_rtx) /* mov r,L */
{
@@ -2091,7 +1981,7 @@ out_movqi_r_mr (rtx insn, rtx op[], int
/* memory access by reg+disp */
else if (GET_CODE (x) == PLUS
&& REG_P (XEXP (x,0))
- && GET_CODE (XEXP (x,1)) == CONST_INT)
+ && CONST_INT_P (XEXP (x,1)))
{
if ((INTVAL (XEXP (x,1)) - GET_MODE_SIZE (GET_MODE (src))) >= 63)
{
@@ -2654,7 +2544,7 @@ output_movsisf(rtx insn, rtx operands[],
AS2 (ldi,%D0,hhi8(%1)));
}
- if (GET_CODE (src) == CONST_INT)
+ if (CONST_INT_P (src))
{
const char *const clr_op0 =
AVR_HAVE_MOVW ? (AS1 (clr,%A0) CR_TAB
@@ -2779,7 +2669,7 @@ out_movqi_mr_r (rtx insn, rtx op[], int
/* memory access by reg+disp */
else if (GET_CODE (x) == PLUS
&& REG_P (XEXP (x,0))
- && GET_CODE (XEXP (x,1)) == CONST_INT)
+ && CONST_INT_P (XEXP (x,1)))
{
if ((INTVAL (XEXP (x,1)) - GET_MODE_SIZE (GET_MODE (dest))) >= 63)
{
@@ -2967,9 +2857,11 @@ out_movhi_mr_r (rtx insn, rtx op[], int
return "";
}
+
+/* Implement `TARGET_FRAME_POINTER_REQUIRED'. */
/* Return 1 if frame pointer for current function required. */
-bool
+static bool
avr_frame_pointer_required_p (void)
{
return (cfun->calls_alloca
@@ -3100,7 +2992,7 @@ out_shift_with_cnt (const char *templ, r
if (len)
*len = 1;
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL);
int count = INTVAL (operands[2]);
@@ -3225,7 +3117,7 @@ out_shift_with_cnt (const char *templ, r
const char *
ashlqi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int k;
@@ -3322,7 +3214,7 @@ ashlqi3_out (rtx insn, rtx operands[], i
const char *
ashlhi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL);
int ldi_ok = test_hard_reg_class (LD_REGS, operands[0]);
@@ -3580,7 +3472,7 @@ ashlhi3_out (rtx insn, rtx operands[], i
const char *
ashlsi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int k;
int *t = len;
@@ -3670,7 +3562,7 @@ ashlsi3_out (rtx insn, rtx operands[], i
const char *
ashrqi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int k;
@@ -3742,7 +3634,7 @@ ashrqi3_out (rtx insn, rtx operands[], i
const char *
ashrhi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL);
int ldi_ok = test_hard_reg_class (LD_REGS, operands[0]);
@@ -3906,7 +3798,7 @@ ashrhi3_out (rtx insn, rtx operands[], i
const char *
ashrsi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int k;
int *t = len;
@@ -4004,7 +3896,7 @@ ashrsi3_out (rtx insn, rtx operands[], i
const char *
lshrqi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int k;
@@ -4099,7 +3991,7 @@ lshrqi3_out (rtx insn, rtx operands[], i
const char *
lshrhi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL);
int ldi_ok = test_hard_reg_class (LD_REGS, operands[0]);
@@ -4356,7 +4248,7 @@ lshrhi3_out (rtx insn, rtx operands[], i
const char *
lshrsi3_out (rtx insn, rtx operands[], int *len)
{
- if (GET_CODE (operands[2]) == CONST_INT)
+ if (CONST_INT_P (operands[2]))
{
int k;
int *t = len;
@@ -4585,6 +4477,8 @@ avr_rotate_bytes (rtx operands[])
return true;
}
+
+/* Implement `ADJUST_INSN_LENGTH'. */
/* Modifies the length assigned to instruction INSN
LEN is the initially computed length of the insn. */
@@ -4629,7 +4523,7 @@ adjust_insn_length (rtx insn, int len)
}
else if (GET_CODE (op[1]) == AND)
{
- if (GET_CODE (XEXP (op[1],1)) == CONST_INT)
+ if (CONST_INT_P (XEXP (op[1],1)))
{
HOST_WIDE_INT mask = INTVAL (XEXP (op[1],1));
if (GET_MODE (op[1]) == SImode)
@@ -4644,7 +4538,7 @@ adjust_insn_length (rtx insn, int len)
}
else if (GET_CODE (op[1]) == IOR)
{
- if (GET_CODE (XEXP (op[1],1)) == CONST_INT)
+ if (CONST_INT_P (XEXP (op[1],1)))
{
HOST_WIDE_INT mask = INTVAL (XEXP (op[1],1));
if (GET_MODE (op[1]) == SImode)
@@ -4848,6 +4742,8 @@ _reg_unused_after (rtx insn, rtx reg)
return 1;
}
+
+/* Implement `TARGET_ASM_INTEGER'. */
/* Target hook for assembling integer objects. The AVR version needs
special handling for references to certain labels. */
@@ -4855,7 +4751,7 @@ static bool
avr_assemble_integer (rtx x, unsigned int size, int aligned_p)
{
if (size == POINTER_SIZE / BITS_PER_UNIT && aligned_p
- && text_segment_operand (x, VOIDmode) )
+ && text_segment_operand (x, VOIDmode))
{
fputs ("\t.word\tgs(", asm_out_file);
output_addr_const (asm_out_file, x);
@@ -4899,6 +4795,7 @@ avr_asm_declare_function_name (FILE *fil
}
+/* Implement `TARGET_CLASS_LIKELY_SPILLED_P'. */
/* Return value is nonzero if pseudos that have been
assigned to registers of class CLASS would likely be spilled
because registers of CLASS are needed for spill registers. */
@@ -5021,6 +4918,8 @@ avr_progmem_p (tree decl, tree attribute
return 0;
}
+
+/* Implement `TARGET_INSERT_ATTRIBUTES'. */
/* Add the section attribute if the variable is in progmem. */
static void
@@ -5034,9 +4933,11 @@ avr_insert_attributes (tree node, tree *
{
static const char dsec[] = ".progmem.data";
- *attributes = tree_cons (get_identifier ("section"),
- build_tree_list (NULL, build_string (strlen (dsec), dsec)),
- *attributes);
+ *attributes =
+ tree_cons (get_identifier ("section"),
+ build_tree_list (NULL,
+ build_string (strlen (dsec), dsec)),
+ *attributes);
}
else
{
@@ -5122,7 +5023,7 @@ avr_asm_init_sections (void)
/* Implement `TARGET_ASM_NAMED_SECTION'. */
/* Track need of __do_clear_bss, __do_copy_data for named sections. */
-void
+static void
avr_asm_named_section (const char *name, unsigned int flags, tree decl)
{
if (!avr_need_copy_data_p)
@@ -5136,6 +5037,9 @@ avr_asm_named_section (const char *name,
default_elf_asm_named_section (name, flags, decl);
}
+
+/* Implement `TARGET_SECTION_TYPE_FLAGS'. */
+
static unsigned int
avr_section_type_flags (tree decl, const char *name, int reloc)
{
@@ -5224,6 +5128,8 @@ avr_file_end (void)
fputs (".global __do_clear_bss\n", asm_out_file);
}
+
+/* Implement `ADJUST_REG_ALLOC_ORDER'. */
/* Choose the order in which to allocate hard registers for
pseudo-registers local to a basic block.
@@ -5296,7 +5202,8 @@ avr_register_move_cost (enum machine_mod
/* Implement `TARGET_MEMORY_MOVE_COST' */
static int
-avr_memory_move_cost (enum machine_mode mode, reg_class_t rclass ATTRIBUTE_UNUSED,
+avr_memory_move_cost (enum machine_mode mode,
+ reg_class_t rclass ATTRIBUTE_UNUSED,
bool in ATTRIBUTE_UNUSED)
{
return (mode == QImode ? 2
@@ -5307,37 +5214,7 @@ avr_memory_move_cost (enum machine_mode
}
-/* Mutually recursive subroutine of avr_rtx_cost for calculating the
- cost of an RTX operand given its context. X is the rtx of the
- operand, MODE is its mode, and OUTER is the rtx_code of this
- operand's parent operator. */
-
-static int
-avr_operand_rtx_cost (rtx x, enum machine_mode mode, enum rtx_code outer,
- bool speed)
-{
- enum rtx_code code = GET_CODE (x);
- int total;
-
- switch (code)
- {
- case REG:
- case SUBREG:
- return 0;
-
- case CONST_INT:
- case CONST_DOUBLE:
- return COSTS_N_INSNS (GET_MODE_SIZE (mode));
-
- default:
- break;
- }
-
- total = 0;
- avr_rtx_costs (x, code, outer, &total, speed);
- return total;
-}
-
+/* Implement `TARGET_RTX_COSTS'. */
/* The AVR backend's rtx_cost function. X is rtx expression whose cost
is to be calculated. Return true if the complete cost has been
computed, and false if subexpressions should be scanned. In either
@@ -5424,12 +5301,12 @@ avr_rtx_costs (rtx x, int codearg, int o
{
case QImode:
*total = COSTS_N_INSNS (1);
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
break;
case HImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (2);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5441,7 +5318,7 @@ avr_rtx_costs (rtx x, int codearg, int o
break;
case SImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (4);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5463,7 +5340,7 @@ avr_rtx_costs (rtx x, int codearg, int o
case IOR:
*total = COSTS_N_INSNS (GET_MODE_SIZE (mode));
*total += avr_operand_rtx_cost (XEXP (x, 0), mode, code, speed);
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
return true;
@@ -5552,7 +5429,7 @@ avr_rtx_costs (rtx x, int codearg, int o
switch (mode)
{
case QImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 4 : 17);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5570,7 +5447,7 @@ avr_rtx_costs (rtx x, int codearg, int o
break;
case HImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 5 : 41);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5615,7 +5492,7 @@ avr_rtx_costs (rtx x, int codearg, int o
break;
case SImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 7 : 113);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5656,7 +5533,7 @@ avr_rtx_costs (rtx x, int codearg, int o
switch (mode)
{
case QImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 4 : 17);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5676,7 +5553,7 @@ avr_rtx_costs (rtx x, int codearg, int o
break;
case HImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 5 : 41);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5720,7 +5597,7 @@ avr_rtx_costs (rtx x, int codearg, int o
break;
case SImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 7 : 113);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5761,7 +5638,7 @@ avr_rtx_costs (rtx x, int codearg, int o
switch (mode)
{
case QImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 4 : 17);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5779,7 +5656,7 @@ avr_rtx_costs (rtx x, int codearg, int o
break;
case HImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 5 : 41);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5826,7 +5703,7 @@ avr_rtx_costs (rtx x, int codearg, int o
break;
case SImode:
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
{
*total = COSTS_N_INSNS (!speed ? 7 : 113);
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
@@ -5868,13 +5745,13 @@ avr_rtx_costs (rtx x, int codearg, int o
{
case QImode:
*total = COSTS_N_INSNS (1);
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
break;
case HImode:
*total = COSTS_N_INSNS (2);
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
else if (INTVAL (XEXP (x, 1)) != 0)
*total += COSTS_N_INSNS (1);
@@ -5882,7 +5759,7 @@ avr_rtx_costs (rtx x, int codearg, int o
case SImode:
*total = COSTS_N_INSNS (4);
- if (GET_CODE (XEXP (x, 1)) != CONST_INT)
+ if (!CONST_INT_P (XEXP (x, 1)))
*total += avr_operand_rtx_cost (XEXP (x, 1), mode, code, speed);
else if (INTVAL (XEXP (x, 1)) != 0)
*total += COSTS_N_INSNS (3);
@@ -5900,13 +5777,47 @@ avr_rtx_costs (rtx x, int codearg, int o
return false;
}
+
+/* Mutually recursive subroutine of avr_rtx_cost for calculating the
+ cost of an RTX operand given its context. X is the rtx of the
+ operand, MODE is its mode, and OUTER is the rtx_code of this
+ operand's parent operator. */
+
+static int
+avr_operand_rtx_cost (rtx x, enum machine_mode mode, enum rtx_code outer,
+ bool speed)
+{
+ enum rtx_code code = GET_CODE (x);
+ int total;
+
+ switch (code)
+ {
+ case REG:
+ case SUBREG:
+ return 0;
+
+ case CONST_INT:
+ case CONST_DOUBLE:
+ return COSTS_N_INSNS (GET_MODE_SIZE (mode));
+
+ default:
+ break;
+ }
+
+ total = 0;
+ avr_rtx_costs (x, code, outer, &total, speed);
+ return total;
+}
+
+
+/* Implement `TARGET_ADDRESS_COST'. */
/* Calculate the cost of a memory address. */
static int
avr_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
{
if (GET_CODE (x) == PLUS
- && GET_CODE (XEXP (x,1)) == CONST_INT
+ && CONST_INT_P (XEXP (x,1))
&& (REG_P (XEXP (x,0)) || GET_CODE (XEXP (x,0)) == SUBREG)
&& INTVAL (XEXP (x,1)) >= 61)
return 18;
@@ -5927,7 +5838,7 @@ extra_constraint_Q (rtx x)
{
if (GET_CODE (XEXP (x,0)) == PLUS
&& REG_P (XEXP (XEXP (x,0), 0))
- && GET_CODE (XEXP (XEXP (x,0), 1)) == CONST_INT
+ && CONST_INT_P (XEXP (XEXP (x,0), 1))
&& (INTVAL (XEXP (XEXP (x,0), 1))
<= MAX_LD_OFFSET (GET_MODE (x))))
{
@@ -5972,6 +5883,8 @@ avr_normalize_condition (RTX_CODE condit
}
}
+
+/* Implement `TARGET_MACHINE_DEPENDENT_REORG'. */
/* This function optimizes conditional jumps. */
static void
@@ -6029,7 +5942,7 @@ avr_reorg (void)
INSN_CODE (insn) = -1;
}
else if (true_regnum (XEXP (pattern,0)) >= 0
- && GET_CODE (XEXP (pattern,1)) == CONST_INT)
+ && CONST_INT_P (XEXP (pattern,1)))
{
rtx x = XEXP (pattern,1);
rtx next = next_real_insn (insn);
@@ -6067,6 +5980,8 @@ avr_function_value_regno_p (const unsign
return (regno == avr_ret_register ());
}
+
+/* Implement `TARGET_LIBCALL_VALUE'. */
/* Create an RTX representing the place where a
library function returns a value of mode MODE. */
@@ -6080,6 +5995,8 @@ avr_libcall_value (enum machine_mode mod
return gen_rtx_REG (mode, avr_ret_register () + 2 - offs);
}
+
+/* Implement `TARGET_FUNCTION_VALUE'. */
/* Create an RTX representing the place where a
function returns a value of data type VALTYPE. */
@@ -6129,6 +6046,8 @@ jump_over_one_insn_p (rtx insn, rtx dest
return dest_addr - jump_addr == get_attr_length (insn) + 1;
}
+
+/* Implement `HARD_REGNO_MODE_OK'. */
/* Returns 1 if a value of mode MODE can be stored starting with hard
register number REGNO. On the enhanced core, anything larger than
1 byte must start in even numbered register for "movw" to work
@@ -6167,7 +6086,7 @@ output_reload_inhi (rtx insn ATTRIBUTE_U
if (!len)
len = &tmp;
- if (GET_CODE (operands[1]) == CONST_INT)
+ if (CONST_INT_P (operands[1]))
{
int val = INTVAL (operands[1]);
if ((val & 0xff) == 0)
@@ -6204,7 +6123,7 @@ const char *
output_reload_insisf (rtx insn ATTRIBUTE_UNUSED, rtx *operands, int *len)
{
rtx src = operands[1];
- int cnst = (GET_CODE (src) == CONST_INT);
+ int cnst = CONST_INT_P (src);
if (len)
{
@@ -6260,6 +6179,9 @@ avr_output_bld (rtx operands[], int bit_
output_asm_insn (s, operands);
}
+
+/* Implement `ASM_OUTPUT_ADDR_VEC_ELT'. */
+
void
avr_output_addr_vec_elt (FILE *stream, int value)
{
@@ -6270,10 +6192,12 @@ avr_output_addr_vec_elt (FILE *stream, i
fprintf (stream, "\trjmp .L%d\n", value);
}
+
+/* Implement `TARGET_HARD_REGNO_SCRATCH_OK'. */
/* Returns true if SCRATCH are safe to be allocated as a scratch
registers (for a define_peephole2) in the current function. */
-bool
+static bool
avr_hard_regno_scratch_ok (unsigned int regno)
{
/* Interrupt functions can only use registers that have already been saved
@@ -6286,6 +6210,8 @@ avr_hard_regno_scratch_ok (unsigned int
return true;
}
+
+/* Implement `HARD_REGNO_RENAME_OK'. */
/* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
int
@@ -6326,7 +6252,7 @@ avr_out_sbxx_branch (rtx insn, rtx opera
if (reverse)
comp = reverse_condition (comp);
- if (GET_CODE (operands[1]) == CONST_INT)
+ if (CONST_INT_P (operands[1]))
{
if (INTVAL (operands[1]) < 0x40)
{
@@ -6406,7 +6332,8 @@ avr_return_in_memory (const_tree type, c
/* Worker function for CASE_VALUES_THRESHOLD. */
-unsigned int avr_case_values_threshold (void)
+static unsigned int
+avr_case_values_threshold (void)
{
return (!AVR_HAVE_JMP_CALL || TARGET_CALL_PROLOGUES) ? 8 : 17;
}
@@ -6718,8 +6645,9 @@ avr_expand_builtin (tree exp, rtx target
arg0 = CALL_EXPR_ARG (exp, 0);
op0 = expand_expr (arg0, NULL_RTX, VOIDmode, EXPAND_NORMAL);
- if (! CONST_INT_P (op0))
- error ("__builtin_avr_delay_cycles expects a compile time integer constant.");
+ if (!CONST_INT_P (op0))
+ error ("__builtin_avr_delay_cycles expects a "
+ "compile time integer constant.");
avr_expand_delay_cycles (op0);
return 0;
@@ -6737,5 +6665,112 @@ avr_expand_builtin (tree exp, rtx target
gcc_unreachable ();
}
+
+
+/* Initialize the GCC target structure. */
+
+#undef TARGET_ASM_ALIGNED_HI_OP
+#define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
+#undef TARGET_ASM_ALIGNED_SI_OP
+#define TARGET_ASM_ALIGNED_SI_OP "\t.long\t"
+#undef TARGET_ASM_UNALIGNED_HI_OP
+#define TARGET_ASM_UNALIGNED_HI_OP "\t.word\t"
+#undef TARGET_ASM_UNALIGNED_SI_OP
+#define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
+#undef TARGET_ASM_INTEGER
+#define TARGET_ASM_INTEGER avr_assemble_integer
+#undef TARGET_ASM_FILE_START
+#define TARGET_ASM_FILE_START avr_file_start
+#undef TARGET_ASM_FILE_END
+#define TARGET_ASM_FILE_END avr_file_end
+
+#undef TARGET_ASM_FUNCTION_END_PROLOGUE
+#define TARGET_ASM_FUNCTION_END_PROLOGUE avr_asm_function_end_prologue
+#undef TARGET_ASM_FUNCTION_BEGIN_EPILOGUE
+#define TARGET_ASM_FUNCTION_BEGIN_EPILOGUE avr_asm_function_begin_epilogue
+
+#undef TARGET_FUNCTION_VALUE
+#define TARGET_FUNCTION_VALUE avr_function_value
+#undef TARGET_LIBCALL_VALUE
+#define TARGET_LIBCALL_VALUE avr_libcall_value
+#undef TARGET_FUNCTION_VALUE_REGNO_P
+#define TARGET_FUNCTION_VALUE_REGNO_P avr_function_value_regno_p
+
+#undef TARGET_ATTRIBUTE_TABLE
+#define TARGET_ATTRIBUTE_TABLE avr_attribute_table
+#undef TARGET_ASM_FUNCTION_RODATA_SECTION
+#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
+#undef TARGET_INSERT_ATTRIBUTES
+#define TARGET_INSERT_ATTRIBUTES avr_insert_attributes
+#undef TARGET_SECTION_TYPE_FLAGS
+#define TARGET_SECTION_TYPE_FLAGS avr_section_type_flags
+
+/* `TARGET_ASM_NAMED_SECTION' must be defined in avr.h. */
+
+#undef TARGET_ASM_INIT_SECTIONS
+#define TARGET_ASM_INIT_SECTIONS avr_asm_init_sections
+#undef TARGET_ENCODE_SECTION_INFO
+#define TARGET_ENCODE_SECTION_INFO avr_encode_section_info
+
+#undef TARGET_REGISTER_MOVE_COST
+#define TARGET_REGISTER_MOVE_COST avr_register_move_cost
+#undef TARGET_MEMORY_MOVE_COST
+#define TARGET_MEMORY_MOVE_COST avr_memory_move_cost
+#undef TARGET_RTX_COSTS
+#define TARGET_RTX_COSTS avr_rtx_costs
+#undef TARGET_ADDRESS_COST
+#define TARGET_ADDRESS_COST avr_address_cost
+#undef TARGET_MACHINE_DEPENDENT_REORG
+#define TARGET_MACHINE_DEPENDENT_REORG avr_reorg
+#undef TARGET_FUNCTION_ARG
+#define TARGET_FUNCTION_ARG avr_function_arg
+#undef TARGET_FUNCTION_ARG_ADVANCE
+#define TARGET_FUNCTION_ARG_ADVANCE avr_function_arg_advance
+
+#undef TARGET_LEGITIMIZE_ADDRESS
+#define TARGET_LEGITIMIZE_ADDRESS avr_legitimize_address
+
+#undef TARGET_RETURN_IN_MEMORY
+#define TARGET_RETURN_IN_MEMORY avr_return_in_memory
+
+#undef TARGET_STRICT_ARGUMENT_NAMING
+#define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
+
+#undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
+#define TARGET_BUILTIN_SETJMP_FRAME_VALUE avr_builtin_setjmp_frame_value
+
+#undef TARGET_HARD_REGNO_SCRATCH_OK
+#define TARGET_HARD_REGNO_SCRATCH_OK avr_hard_regno_scratch_ok
+#undef TARGET_CASE_VALUES_THRESHOLD
+#define TARGET_CASE_VALUES_THRESHOLD avr_case_values_threshold
+
+#undef TARGET_LEGITIMATE_ADDRESS_P
+#define TARGET_LEGITIMATE_ADDRESS_P avr_legitimate_address_p
+
+#undef TARGET_FRAME_POINTER_REQUIRED
+#define TARGET_FRAME_POINTER_REQUIRED avr_frame_pointer_required_p
+#undef TARGET_CAN_ELIMINATE
+#define TARGET_CAN_ELIMINATE avr_can_eliminate
+
+#undef TARGET_CLASS_LIKELY_SPILLED_P
+#define TARGET_CLASS_LIKELY_SPILLED_P avr_class_likely_spilled_p
+
+#undef TARGET_OPTION_OVERRIDE
+#define TARGET_OPTION_OVERRIDE avr_option_override
+
+#undef TARGET_CANNOT_MODIFY_JUMPS_P
+#define TARGET_CANNOT_MODIFY_JUMPS_P avr_cannot_modify_jumps_p
+
+#undef TARGET_FUNCTION_OK_FOR_SIBCALL
+#define TARGET_FUNCTION_OK_FOR_SIBCALL avr_function_ok_for_sibcall
+
+#undef TARGET_INIT_BUILTINS
+#define TARGET_INIT_BUILTINS avr_init_builtins
+
+#undef TARGET_EXPAND_BUILTIN
+#define TARGET_EXPAND_BUILTIN avr_expand_builtin
+
+
+struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-avr.h"