xref: /openbsd/gnu/gcc/gcc/config/avr/avr.h (revision 404b540a)
1*404b540aSrobert /* Definitions of target machine for GNU compiler,
2*404b540aSrobert    for ATMEL AVR at90s8515, ATmega103/103L, ATmega603/603L microcontrollers.
3*404b540aSrobert    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4*404b540aSrobert    Free Software Foundation, Inc.
5*404b540aSrobert    Contributed by Denis Chertykov (denisc@overta.ru)
6*404b540aSrobert 
7*404b540aSrobert This file is part of GCC.
8*404b540aSrobert 
9*404b540aSrobert GCC is free software; you can redistribute it and/or modify
10*404b540aSrobert it under the terms of the GNU General Public License as published by
11*404b540aSrobert the Free Software Foundation; either version 2, or (at your option)
12*404b540aSrobert any later version.
13*404b540aSrobert 
14*404b540aSrobert GCC is distributed in the hope that it will be useful,
15*404b540aSrobert but WITHOUT ANY WARRANTY; without even the implied warranty of
16*404b540aSrobert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*404b540aSrobert GNU General Public License for more details.
18*404b540aSrobert 
19*404b540aSrobert You should have received a copy of the GNU General Public License
20*404b540aSrobert along with GCC; see the file COPYING.  If not, write to
21*404b540aSrobert the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22*404b540aSrobert Boston, MA 02110-1301, USA.  */
23*404b540aSrobert 
24*404b540aSrobert /* Names to predefine in the preprocessor for this target machine.  */
25*404b540aSrobert 
26*404b540aSrobert #define TARGET_CPU_CPP_BUILTINS()		\
27*404b540aSrobert   do						\
28*404b540aSrobert     {						\
29*404b540aSrobert       builtin_define_std ("AVR");		\
30*404b540aSrobert       if (avr_base_arch_macro)			\
31*404b540aSrobert 	builtin_define (avr_base_arch_macro);	\
32*404b540aSrobert       if (avr_extra_arch_macro)			\
33*404b540aSrobert 	builtin_define (avr_extra_arch_macro);	\
34*404b540aSrobert       if (avr_have_movw_lpmx_p)			\
35*404b540aSrobert 	builtin_define ("__AVR_HAVE_MOVW__");	\
36*404b540aSrobert       if (avr_have_movw_lpmx_p)			\
37*404b540aSrobert 	builtin_define ("__AVR_HAVE_LPMX__");	\
38*404b540aSrobert       if (avr_asm_only_p)			\
39*404b540aSrobert 	builtin_define ("__AVR_ASM_ONLY__");	\
40*404b540aSrobert       if (avr_enhanced_p)			\
41*404b540aSrobert 	builtin_define ("__AVR_ENHANCED__");	\
42*404b540aSrobert       if (avr_enhanced_p)			\
43*404b540aSrobert 	builtin_define ("__AVR_HAVE_MUL__");	\
44*404b540aSrobert       if (avr_mega_p)				\
45*404b540aSrobert 	builtin_define ("__AVR_MEGA__");	\
46*404b540aSrobert       if (TARGET_NO_INTERRUPTS)			\
47*404b540aSrobert 	builtin_define ("__NO_INTERRUPTS__");	\
48*404b540aSrobert     }						\
49*404b540aSrobert   while (0)
50*404b540aSrobert 
51*404b540aSrobert extern const char *avr_base_arch_macro;
52*404b540aSrobert extern const char *avr_extra_arch_macro;
53*404b540aSrobert extern int avr_mega_p;
54*404b540aSrobert extern int avr_enhanced_p;
55*404b540aSrobert extern int avr_asm_only_p;
56*404b540aSrobert extern int avr_have_movw_lpmx_p;
57*404b540aSrobert #ifndef IN_LIBGCC2
58*404b540aSrobert extern GTY(()) section *progmem_section;
59*404b540aSrobert #endif
60*404b540aSrobert 
61*404b540aSrobert #define AVR_MEGA (avr_mega_p && !TARGET_SHORT_CALLS)
62*404b540aSrobert #define AVR_ENHANCED (avr_enhanced_p)
63*404b540aSrobert #define AVR_HAVE_MOVW (avr_have_movw_lpmx_p)
64*404b540aSrobert 
65*404b540aSrobert #define TARGET_VERSION fprintf (stderr, " (GNU assembler syntax)");
66*404b540aSrobert 
67*404b540aSrobert #define OVERRIDE_OPTIONS avr_override_options ()
68*404b540aSrobert 
69*404b540aSrobert #define CAN_DEBUG_WITHOUT_FP
70*404b540aSrobert 
71*404b540aSrobert #define BITS_BIG_ENDIAN 0
72*404b540aSrobert #define BYTES_BIG_ENDIAN 0
73*404b540aSrobert #define WORDS_BIG_ENDIAN 0
74*404b540aSrobert 
75*404b540aSrobert #ifdef IN_LIBGCC2
76*404b540aSrobert /* This is to get correct SI and DI modes in libgcc2.c (32 and 64 bits).  */
77*404b540aSrobert #define UNITS_PER_WORD 4
78*404b540aSrobert #else
79*404b540aSrobert /* Width of a word, in units (bytes).  */
80*404b540aSrobert #define UNITS_PER_WORD 1
81*404b540aSrobert #endif
82*404b540aSrobert 
83*404b540aSrobert #define POINTER_SIZE 16
84*404b540aSrobert 
85*404b540aSrobert 
86*404b540aSrobert /* Maximum sized of reasonable data type
87*404b540aSrobert    DImode or Dfmode ...  */
88*404b540aSrobert #define MAX_FIXED_MODE_SIZE 32
89*404b540aSrobert 
90*404b540aSrobert #define PARM_BOUNDARY 8
91*404b540aSrobert 
92*404b540aSrobert #define FUNCTION_BOUNDARY 8
93*404b540aSrobert 
94*404b540aSrobert #define EMPTY_FIELD_BOUNDARY 8
95*404b540aSrobert 
96*404b540aSrobert /* No data type wants to be aligned rounder than this.  */
97*404b540aSrobert #define BIGGEST_ALIGNMENT 8
98*404b540aSrobert 
99*404b540aSrobert 
100*404b540aSrobert #define STRICT_ALIGNMENT 0
101*404b540aSrobert 
102*404b540aSrobert #define INT_TYPE_SIZE (TARGET_INT8 ? 8 : 16)
103*404b540aSrobert #define SHORT_TYPE_SIZE (INT_TYPE_SIZE == 8 ? INT_TYPE_SIZE : 16)
104*404b540aSrobert #define LONG_TYPE_SIZE (INT_TYPE_SIZE == 8 ? 16 : 32)
105*404b540aSrobert #define LONG_LONG_TYPE_SIZE (INT_TYPE_SIZE == 8 ? 32 : 64)
106*404b540aSrobert #define FLOAT_TYPE_SIZE 32
107*404b540aSrobert #define DOUBLE_TYPE_SIZE 32
108*404b540aSrobert #define LONG_DOUBLE_TYPE_SIZE 32
109*404b540aSrobert 
110*404b540aSrobert #define DEFAULT_SIGNED_CHAR 1
111*404b540aSrobert 
112*404b540aSrobert #define SIZE_TYPE (INT_TYPE_SIZE == 8 ? "long unsigned int" : "unsigned int")
113*404b540aSrobert #define PTRDIFF_TYPE (INT_TYPE_SIZE == 8 ? "long int" :"int")
114*404b540aSrobert 
115*404b540aSrobert #define WCHAR_TYPE_SIZE 16
116*404b540aSrobert 
117*404b540aSrobert #define FIRST_PSEUDO_REGISTER 36
118*404b540aSrobert 
119*404b540aSrobert #define FIXED_REGISTERS {\
120*404b540aSrobert   1,1,/* r0 r1 */\
121*404b540aSrobert   0,0,/* r2 r3 */\
122*404b540aSrobert   0,0,/* r4 r5 */\
123*404b540aSrobert   0,0,/* r6 r7 */\
124*404b540aSrobert   0,0,/* r8 r9 */\
125*404b540aSrobert   0,0,/* r10 r11 */\
126*404b540aSrobert   0,0,/* r12 r13 */\
127*404b540aSrobert   0,0,/* r14 r15 */\
128*404b540aSrobert   0,0,/* r16 r17 */\
129*404b540aSrobert   0,0,/* r18 r19 */\
130*404b540aSrobert   0,0,/* r20 r21 */\
131*404b540aSrobert   0,0,/* r22 r23 */\
132*404b540aSrobert   0,0,/* r24 r25 */\
133*404b540aSrobert   0,0,/* r26 r27 */\
134*404b540aSrobert   0,0,/* r28 r29 */\
135*404b540aSrobert   0,0,/* r30 r31 */\
136*404b540aSrobert   1,1,/*  STACK */\
137*404b540aSrobert   1,1 /* arg pointer */  }
138*404b540aSrobert 
139*404b540aSrobert #define CALL_USED_REGISTERS {			\
140*404b540aSrobert   1,1,/* r0 r1 */				\
141*404b540aSrobert     0,0,/* r2 r3 */				\
142*404b540aSrobert     0,0,/* r4 r5 */				\
143*404b540aSrobert     0,0,/* r6 r7 */				\
144*404b540aSrobert     0,0,/* r8 r9 */				\
145*404b540aSrobert     0,0,/* r10 r11 */				\
146*404b540aSrobert     0,0,/* r12 r13 */				\
147*404b540aSrobert     0,0,/* r14 r15 */				\
148*404b540aSrobert     0,0,/* r16 r17 */				\
149*404b540aSrobert     1,1,/* r18 r19 */				\
150*404b540aSrobert     1,1,/* r20 r21 */				\
151*404b540aSrobert     1,1,/* r22 r23 */				\
152*404b540aSrobert     1,1,/* r24 r25 */				\
153*404b540aSrobert     1,1,/* r26 r27 */				\
154*404b540aSrobert     0,0,/* r28 r29 */				\
155*404b540aSrobert     1,1,/* r30 r31 */				\
156*404b540aSrobert     1,1,/*  STACK */				\
157*404b540aSrobert     1,1 /* arg pointer */  }
158*404b540aSrobert 
159*404b540aSrobert #define REG_ALLOC_ORDER {			\
160*404b540aSrobert     24,25,					\
161*404b540aSrobert     18,19,					\
162*404b540aSrobert     20,21,					\
163*404b540aSrobert     22,23,					\
164*404b540aSrobert     30,31,					\
165*404b540aSrobert     26,27,					\
166*404b540aSrobert     28,29,					\
167*404b540aSrobert     17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,	\
168*404b540aSrobert     0,1,					\
169*404b540aSrobert     32,33,34,35					\
170*404b540aSrobert     }
171*404b540aSrobert 
172*404b540aSrobert #define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc ()
173*404b540aSrobert 
174*404b540aSrobert 
175*404b540aSrobert #define HARD_REGNO_NREGS(REGNO, MODE) ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
176*404b540aSrobert 
177*404b540aSrobert #define HARD_REGNO_MODE_OK(REGNO, MODE) avr_hard_regno_mode_ok(REGNO, MODE)
178*404b540aSrobert 
179*404b540aSrobert #define MODES_TIEABLE_P(MODE1, MODE2) 1
180*404b540aSrobert 
181*404b540aSrobert enum reg_class {
182*404b540aSrobert   NO_REGS,
183*404b540aSrobert   R0_REG,			/* r0 */
184*404b540aSrobert   POINTER_X_REGS,		/* r26 - r27 */
185*404b540aSrobert   POINTER_Y_REGS,		/* r28 - r29 */
186*404b540aSrobert   POINTER_Z_REGS,		/* r30 - r31 */
187*404b540aSrobert   STACK_REG,			/* STACK */
188*404b540aSrobert   BASE_POINTER_REGS,		/* r28 - r31 */
189*404b540aSrobert   POINTER_REGS,			/* r26 - r31 */
190*404b540aSrobert   ADDW_REGS,			/* r24 - r31 */
191*404b540aSrobert   SIMPLE_LD_REGS,		/* r16 - r23 */
192*404b540aSrobert   LD_REGS,			/* r16 - r31 */
193*404b540aSrobert   NO_LD_REGS,			/* r0 - r15 */
194*404b540aSrobert   GENERAL_REGS,			/* r0 - r31 */
195*404b540aSrobert   ALL_REGS, LIM_REG_CLASSES
196*404b540aSrobert };
197*404b540aSrobert 
198*404b540aSrobert 
199*404b540aSrobert #define N_REG_CLASSES (int)LIM_REG_CLASSES
200*404b540aSrobert 
201*404b540aSrobert #define REG_CLASS_NAMES {					\
202*404b540aSrobert 		 "NO_REGS",					\
203*404b540aSrobert 		   "R0_REG",	/* r0 */                        \
204*404b540aSrobert 		   "POINTER_X_REGS", /* r26 - r27 */		\
205*404b540aSrobert 		   "POINTER_Y_REGS", /* r28 - r29 */		\
206*404b540aSrobert 		   "POINTER_Z_REGS", /* r30 - r31 */		\
207*404b540aSrobert 		   "STACK_REG",	/* STACK */			\
208*404b540aSrobert 		   "BASE_POINTER_REGS",	/* r28 - r31 */		\
209*404b540aSrobert 		   "POINTER_REGS", /* r26 - r31 */		\
210*404b540aSrobert 		   "ADDW_REGS",	/* r24 - r31 */			\
211*404b540aSrobert                    "SIMPLE_LD_REGS", /* r16 - r23 */            \
212*404b540aSrobert 		   "LD_REGS",	/* r16 - r31 */			\
213*404b540aSrobert                    "NO_LD_REGS", /* r0 - r15 */                 \
214*404b540aSrobert 		   "GENERAL_REGS", /* r0 - r31 */		\
215*404b540aSrobert 		   "ALL_REGS" }
216*404b540aSrobert 
217*404b540aSrobert #define REG_CLASS_CONTENTS {						\
218*404b540aSrobert   {0x00000000,0x00000000},	/* NO_REGS */				\
219*404b540aSrobert   {0x00000001,0x00000000},	/* R0_REG */                            \
220*404b540aSrobert   {3 << REG_X,0x00000000},      /* POINTER_X_REGS, r26 - r27 */		\
221*404b540aSrobert   {3 << REG_Y,0x00000000},      /* POINTER_Y_REGS, r28 - r29 */		\
222*404b540aSrobert   {3 << REG_Z,0x00000000},      /* POINTER_Z_REGS, r30 - r31 */		\
223*404b540aSrobert   {0x00000000,0x00000003},	/* STACK_REG, STACK */			\
224*404b540aSrobert   {(3 << REG_Y) | (3 << REG_Z),						\
225*404b540aSrobert      0x00000000},		/* BASE_POINTER_REGS, r28 - r31 */	\
226*404b540aSrobert   {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z),				\
227*404b540aSrobert      0x00000000},		/* POINTER_REGS, r26 - r31 */		\
228*404b540aSrobert   {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z) | (3 << REG_W),		\
229*404b540aSrobert      0x00000000},		/* ADDW_REGS, r24 - r31 */		\
230*404b540aSrobert   {0x00ff0000,0x00000000},	/* SIMPLE_LD_REGS r16 - r23 */          \
231*404b540aSrobert   {(3 << REG_X)|(3 << REG_Y)|(3 << REG_Z)|(3 << REG_W)|(0xff << 16),	\
232*404b540aSrobert      0x00000000},	/* LD_REGS, r16 - r31 */			\
233*404b540aSrobert   {0x0000ffff,0x00000000},	/* NO_LD_REGS  r0 - r15 */              \
234*404b540aSrobert   {0xffffffff,0x00000000},	/* GENERAL_REGS, r0 - r31 */		\
235*404b540aSrobert   {0xffffffff,0x00000003}	/* ALL_REGS */				\
236*404b540aSrobert }
237*404b540aSrobert 
238*404b540aSrobert #define REGNO_REG_CLASS(R) avr_regno_reg_class(R)
239*404b540aSrobert 
240*404b540aSrobert #define BASE_REG_CLASS (reload_completed ? BASE_POINTER_REGS : POINTER_REGS)
241*404b540aSrobert 
242*404b540aSrobert #define INDEX_REG_CLASS NO_REGS
243*404b540aSrobert 
244*404b540aSrobert #define REGNO_OK_FOR_BASE_P(r) (((r) < FIRST_PSEUDO_REGISTER		\
245*404b540aSrobert 				 && ((r) == REG_X			\
246*404b540aSrobert 				     || (r) == REG_Y			\
247*404b540aSrobert 				     || (r) == REG_Z			\
248*404b540aSrobert 				     || (r) == ARG_POINTER_REGNUM))	\
249*404b540aSrobert 				|| (reg_renumber			\
250*404b540aSrobert 				    && (reg_renumber[r] == REG_X	\
251*404b540aSrobert 					|| reg_renumber[r] == REG_Y	\
252*404b540aSrobert 					|| reg_renumber[r] == REG_Z	\
253*404b540aSrobert 					|| (reg_renumber[r]		\
254*404b540aSrobert 					    == ARG_POINTER_REGNUM))))
255*404b540aSrobert 
256*404b540aSrobert #define REGNO_OK_FOR_INDEX_P(NUM) 0
257*404b540aSrobert 
258*404b540aSrobert #define PREFERRED_RELOAD_CLASS(X, CLASS) preferred_reload_class(X,CLASS)
259*404b540aSrobert 
260*404b540aSrobert #define SMALL_REGISTER_CLASSES 1
261*404b540aSrobert 
262*404b540aSrobert #define CLASS_LIKELY_SPILLED_P(c) class_likely_spilled_p(c)
263*404b540aSrobert 
264*404b540aSrobert #define CLASS_MAX_NREGS(CLASS, MODE)   class_max_nregs (CLASS, MODE)
265*404b540aSrobert 
266*404b540aSrobert #define STACK_PUSH_CODE POST_DEC
267*404b540aSrobert 
268*404b540aSrobert #define STACK_GROWS_DOWNWARD
269*404b540aSrobert 
270*404b540aSrobert #define STARTING_FRAME_OFFSET 1
271*404b540aSrobert 
272*404b540aSrobert #define STACK_POINTER_OFFSET 1
273*404b540aSrobert 
274*404b540aSrobert #define FIRST_PARM_OFFSET(FUNDECL) 0
275*404b540aSrobert 
276*404b540aSrobert #define STACK_BOUNDARY 8
277*404b540aSrobert 
278*404b540aSrobert #define STACK_POINTER_REGNUM 32
279*404b540aSrobert 
280*404b540aSrobert #define FRAME_POINTER_REGNUM REG_Y
281*404b540aSrobert 
282*404b540aSrobert #define ARG_POINTER_REGNUM 34
283*404b540aSrobert 
284*404b540aSrobert #define STATIC_CHAIN_REGNUM 2
285*404b540aSrobert 
286*404b540aSrobert #define FRAME_POINTER_REQUIRED frame_pointer_required_p()
287*404b540aSrobert 
288*404b540aSrobert /* Offset from the frame pointer register value to the top of the stack.  */
289*404b540aSrobert #define FRAME_POINTER_CFA_OFFSET(FNDECL) 0
290*404b540aSrobert 
291*404b540aSrobert #define ELIMINABLE_REGS {					\
292*404b540aSrobert       {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},		\
293*404b540aSrobert 	{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}		\
294*404b540aSrobert        ,{FRAME_POINTER_REGNUM+1,STACK_POINTER_REGNUM+1}}
295*404b540aSrobert 
296*404b540aSrobert #define CAN_ELIMINATE(FROM, TO) (((FROM) == ARG_POINTER_REGNUM		   \
297*404b540aSrobert 				  && (TO) == FRAME_POINTER_REGNUM)	   \
298*404b540aSrobert 				 || (((FROM) == FRAME_POINTER_REGNUM	   \
299*404b540aSrobert 				      || (FROM) == FRAME_POINTER_REGNUM+1) \
300*404b540aSrobert 				     && ! FRAME_POINTER_REQUIRED	   \
301*404b540aSrobert 				     ))
302*404b540aSrobert 
303*404b540aSrobert #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)			\
304*404b540aSrobert      OFFSET = initial_elimination_offset (FROM, TO)
305*404b540aSrobert 
306*404b540aSrobert #define RETURN_ADDR_RTX(count, x) \
307*404b540aSrobert   gen_rtx_MEM (Pmode, memory_address (Pmode, plus_constant (tem, 1)))
308*404b540aSrobert 
309*404b540aSrobert #define PUSH_ROUNDING(NPUSHED) (NPUSHED)
310*404b540aSrobert 
311*404b540aSrobert #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
312*404b540aSrobert 
313*404b540aSrobert #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) (function_arg (&(CUM), MODE, TYPE, NAMED))
314*404b540aSrobert 
315*404b540aSrobert typedef struct avr_args {
316*404b540aSrobert   int nregs;			/* # registers available for passing */
317*404b540aSrobert   int regno;			/* next available register number */
318*404b540aSrobert } CUMULATIVE_ARGS;
319*404b540aSrobert 
320*404b540aSrobert #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
321*404b540aSrobert   init_cumulative_args (&(CUM), FNTYPE, LIBNAME, FNDECL)
322*404b540aSrobert 
323*404b540aSrobert #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)	\
324*404b540aSrobert   (function_arg_advance (&CUM, MODE, TYPE, NAMED))
325*404b540aSrobert 
326*404b540aSrobert #define FUNCTION_ARG_REGNO_P(r) function_arg_regno_p(r)
327*404b540aSrobert 
328*404b540aSrobert extern int avr_reg_order[];
329*404b540aSrobert 
330*404b540aSrobert #define RET_REGISTER avr_ret_register ()
331*404b540aSrobert 
332*404b540aSrobert #define FUNCTION_VALUE(VALTYPE, FUNC) avr_function_value (VALTYPE, FUNC)
333*404b540aSrobert 
334*404b540aSrobert #define LIBCALL_VALUE(MODE)  avr_libcall_value (MODE)
335*404b540aSrobert 
336*404b540aSrobert #define FUNCTION_VALUE_REGNO_P(N) ((int) (N) == RET_REGISTER)
337*404b540aSrobert 
338*404b540aSrobert #define DEFAULT_PCC_STRUCT_RETURN 0
339*404b540aSrobert 
340*404b540aSrobert #define EPILOGUE_USES(REGNO) 0
341*404b540aSrobert 
342*404b540aSrobert #define HAVE_POST_INCREMENT 1
343*404b540aSrobert #define HAVE_PRE_DECREMENT 1
344*404b540aSrobert 
345*404b540aSrobert #define CONSTANT_ADDRESS_P(X) CONSTANT_P (X)
346*404b540aSrobert 
347*404b540aSrobert #define MAX_REGS_PER_ADDRESS 1
348*404b540aSrobert 
349*404b540aSrobert #ifdef REG_OK_STRICT
350*404b540aSrobert #  define GO_IF_LEGITIMATE_ADDRESS(mode, operand, ADDR)	\
351*404b540aSrobert {							\
352*404b540aSrobert   if (legitimate_address_p (mode, operand, 1))		\
353*404b540aSrobert     goto ADDR;						\
354*404b540aSrobert }
355*404b540aSrobert #  else
356*404b540aSrobert #  define GO_IF_LEGITIMATE_ADDRESS(mode, operand, ADDR)	\
357*404b540aSrobert {							\
358*404b540aSrobert   if (legitimate_address_p (mode, operand, 0))		\
359*404b540aSrobert     goto ADDR;						\
360*404b540aSrobert }
361*404b540aSrobert #endif
362*404b540aSrobert 
363*404b540aSrobert #define REG_OK_FOR_BASE_NOSTRICT_P(X) \
364*404b540aSrobert   (REGNO (X) >= FIRST_PSEUDO_REGISTER || REG_OK_FOR_BASE_STRICT_P(X))
365*404b540aSrobert 
366*404b540aSrobert #define REG_OK_FOR_BASE_STRICT_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
367*404b540aSrobert 
368*404b540aSrobert #ifdef REG_OK_STRICT
369*404b540aSrobert #  define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P (X)
370*404b540aSrobert #else
371*404b540aSrobert #  define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NOSTRICT_P (X)
372*404b540aSrobert #endif
373*404b540aSrobert 
374*404b540aSrobert #define REG_OK_FOR_INDEX_P(X) 0
375*404b540aSrobert 
376*404b540aSrobert #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)				\
377*404b540aSrobert {									\
378*404b540aSrobert   (X) = legitimize_address (X, OLDX, MODE);				\
379*404b540aSrobert   if (memory_address_p (MODE, X))					\
380*404b540aSrobert     goto WIN;								\
381*404b540aSrobert }
382*404b540aSrobert 
383*404b540aSrobert #define XEXP_(X,Y) (X)
384*404b540aSrobert #define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN)    \
385*404b540aSrobert do {									    \
386*404b540aSrobert   if (1&&(GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC))	    \
387*404b540aSrobert     {									    \
388*404b540aSrobert       push_reload (XEXP (X,0), XEXP (X,0), &XEXP (X,0), &XEXP (X,0),	    \
389*404b540aSrobert 	           POINTER_REGS, GET_MODE (X),GET_MODE (X) , 0, 0,	    \
390*404b540aSrobert 		   OPNUM, RELOAD_OTHER);				    \
391*404b540aSrobert       goto WIN;								    \
392*404b540aSrobert     }									    \
393*404b540aSrobert   if (GET_CODE (X) == PLUS						    \
394*404b540aSrobert       && REG_P (XEXP (X, 0))						    \
395*404b540aSrobert       && GET_CODE (XEXP (X, 1)) == CONST_INT				    \
396*404b540aSrobert       && INTVAL (XEXP (X, 1)) >= 1)					    \
397*404b540aSrobert     {									    \
398*404b540aSrobert       int fit = INTVAL (XEXP (X, 1)) <= (64 - GET_MODE_SIZE (MODE));	    \
399*404b540aSrobert       if (fit)								    \
400*404b540aSrobert 	{								    \
401*404b540aSrobert           if (reg_equiv_address[REGNO (XEXP (X, 0))] != 0)		    \
402*404b540aSrobert 	    {								    \
403*404b540aSrobert 	      int regno = REGNO (XEXP (X, 0));				    \
404*404b540aSrobert 	      rtx mem = make_memloc (X, regno);				    \
405*404b540aSrobert 	      push_reload (XEXP (mem,0), NULL, &XEXP (mem,0), NULL,         \
406*404b540aSrobert 		           POINTER_REGS, Pmode, VOIDmode, 0, 0,		    \
407*404b540aSrobert 		           1, ADDR_TYPE (TYPE));			    \
408*404b540aSrobert 	      push_reload (mem, NULL_RTX, &XEXP (X, 0), NULL,		    \
409*404b540aSrobert 		           BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0, \
410*404b540aSrobert 		           OPNUM, TYPE);				    \
411*404b540aSrobert 	      goto WIN;							    \
412*404b540aSrobert 	    }								    \
413*404b540aSrobert 	  push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL,	    \
414*404b540aSrobert 		       BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0,	    \
415*404b540aSrobert 		       OPNUM, TYPE);					    \
416*404b540aSrobert           goto WIN;							    \
417*404b540aSrobert 	}								    \
418*404b540aSrobert       else if (! (frame_pointer_needed && XEXP (X,0) == frame_pointer_rtx)) \
419*404b540aSrobert 	{								    \
420*404b540aSrobert 	  push_reload (X, NULL_RTX, &X, NULL,				    \
421*404b540aSrobert 		       POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0,	    \
422*404b540aSrobert 		       OPNUM, TYPE);					    \
423*404b540aSrobert           goto WIN;							    \
424*404b540aSrobert 	}								    \
425*404b540aSrobert     }									    \
426*404b540aSrobert } while(0)
427*404b540aSrobert 
428*404b540aSrobert #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)			\
429*404b540aSrobert       if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC)	\
430*404b540aSrobert         goto LABEL
431*404b540aSrobert 
432*404b540aSrobert #define LEGITIMATE_CONSTANT_P(X) 1
433*404b540aSrobert 
434*404b540aSrobert #define REGISTER_MOVE_COST(MODE, FROM, TO) ((FROM) == STACK_REG ? 6 \
435*404b540aSrobert 					    : (TO) == STACK_REG ? 12 \
436*404b540aSrobert 					    : 2)
437*404b540aSrobert 
438*404b540aSrobert #define MEMORY_MOVE_COST(MODE,CLASS,IN) ((MODE)==QImode ? 2 :	\
439*404b540aSrobert 					 (MODE)==HImode ? 4 :	\
440*404b540aSrobert 					 (MODE)==SImode ? 8 :	\
441*404b540aSrobert 					 (MODE)==SFmode ? 8 : 16)
442*404b540aSrobert 
443*404b540aSrobert #define BRANCH_COST 0
444*404b540aSrobert 
445*404b540aSrobert #define SLOW_BYTE_ACCESS 0
446*404b540aSrobert 
447*404b540aSrobert #define NO_FUNCTION_CSE
448*404b540aSrobert 
449*404b540aSrobert #define TEXT_SECTION_ASM_OP "\t.text"
450*404b540aSrobert 
451*404b540aSrobert #define DATA_SECTION_ASM_OP "\t.data"
452*404b540aSrobert 
453*404b540aSrobert #define BSS_SECTION_ASM_OP "\t.section .bss"
454*404b540aSrobert 
455*404b540aSrobert /* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
456*404b540aSrobert    There are no shared libraries on this target, and these sections are
457*404b540aSrobert    placed in the read-only program memory, so they are not writable.  */
458*404b540aSrobert 
459*404b540aSrobert #undef CTORS_SECTION_ASM_OP
460*404b540aSrobert #define CTORS_SECTION_ASM_OP "\t.section .ctors,\"a\",@progbits"
461*404b540aSrobert 
462*404b540aSrobert #undef DTORS_SECTION_ASM_OP
463*404b540aSrobert #define DTORS_SECTION_ASM_OP "\t.section .dtors,\"a\",@progbits"
464*404b540aSrobert 
465*404b540aSrobert #define TARGET_ASM_CONSTRUCTOR avr_asm_out_ctor
466*404b540aSrobert 
467*404b540aSrobert #define TARGET_ASM_DESTRUCTOR avr_asm_out_dtor
468*404b540aSrobert 
469*404b540aSrobert #define JUMP_TABLES_IN_TEXT_SECTION 0
470*404b540aSrobert 
471*404b540aSrobert #define ASM_COMMENT_START " ; "
472*404b540aSrobert 
473*404b540aSrobert #define ASM_APP_ON "/* #APP */\n"
474*404b540aSrobert 
475*404b540aSrobert #define ASM_APP_OFF "/* #NOAPP */\n"
476*404b540aSrobert 
477*404b540aSrobert /* Switch into a generic section.  */
478*404b540aSrobert #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
479*404b540aSrobert #define TARGET_ASM_INIT_SECTIONS avr_asm_init_sections
480*404b540aSrobert 
481*404b540aSrobert #define ASM_OUTPUT_ASCII(FILE, P, SIZE)	 gas_output_ascii (FILE,P,SIZE)
482*404b540aSrobert 
483*404b540aSrobert #define IS_ASM_LOGICAL_LINE_SEPARATOR(C) ((C) == '\n'			 \
484*404b540aSrobert 					  || ((C) == '$'))
485*404b540aSrobert 
486*404b540aSrobert #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)			   \
487*404b540aSrobert do {									   \
488*404b540aSrobert      fputs ("\t.comm ", (STREAM));					   \
489*404b540aSrobert      assemble_name ((STREAM), (NAME));					   \
490*404b540aSrobert      fprintf ((STREAM), ",%lu,1\n", (unsigned long)(SIZE));		   \
491*404b540aSrobert } while (0)
492*404b540aSrobert 
493*404b540aSrobert #define ASM_OUTPUT_BSS(FILE, DECL, NAME, SIZE, ROUNDED)			\
494*404b540aSrobert   asm_output_bss ((FILE), (DECL), (NAME), (SIZE), (ROUNDED))
495*404b540aSrobert 
496*404b540aSrobert #define ASM_OUTPUT_LOCAL(STREAM, NAME, SIZE, ROUNDED)			\
497*404b540aSrobert do {									\
498*404b540aSrobert      fputs ("\t.lcomm ", (STREAM));					\
499*404b540aSrobert      assemble_name ((STREAM), (NAME));					\
500*404b540aSrobert      fprintf ((STREAM), ",%d\n", (int)(SIZE));				\
501*404b540aSrobert } while (0)
502*404b540aSrobert 
503*404b540aSrobert #undef TYPE_ASM_OP
504*404b540aSrobert #undef SIZE_ASM_OP
505*404b540aSrobert #undef WEAK_ASM_OP
506*404b540aSrobert #define TYPE_ASM_OP	"\t.type\t"
507*404b540aSrobert #define SIZE_ASM_OP	"\t.size\t"
508*404b540aSrobert #define WEAK_ASM_OP	"\t.weak\t"
509*404b540aSrobert /* Define the strings used for the special svr4 .type and .size directives.
510*404b540aSrobert    These strings generally do not vary from one system running svr4 to
511*404b540aSrobert    another, but if a given system (e.g. m88k running svr) needs to use
512*404b540aSrobert    different pseudo-op names for these, they may be overridden in the
513*404b540aSrobert    file which includes this one.  */
514*404b540aSrobert 
515*404b540aSrobert 
516*404b540aSrobert #undef TYPE_OPERAND_FMT
517*404b540aSrobert #define TYPE_OPERAND_FMT	"@%s"
518*404b540aSrobert /* The following macro defines the format used to output the second
519*404b540aSrobert    operand of the .type assembler directive.  Different svr4 assemblers
520*404b540aSrobert    expect various different forms for this operand.  The one given here
521*404b540aSrobert    is just a default.  You may need to override it in your machine-
522*404b540aSrobert    specific tm.h file (depending upon the particulars of your assembler).  */
523*404b540aSrobert 
524*404b540aSrobert #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)		\
525*404b540aSrobert do {								\
526*404b540aSrobert      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");	\
527*404b540aSrobert      ASM_OUTPUT_LABEL (FILE, NAME);				\
528*404b540aSrobert } while (0)
529*404b540aSrobert 
530*404b540aSrobert #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)			\
531*404b540aSrobert   do {									\
532*404b540aSrobert     if (!flag_inhibit_size_directive)					\
533*404b540aSrobert       ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);				\
534*404b540aSrobert   } while (0)
535*404b540aSrobert 
536*404b540aSrobert #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)			\
537*404b540aSrobert do {									\
538*404b540aSrobert   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");			\
539*404b540aSrobert   size_directive_output = 0;						\
540*404b540aSrobert   if (!flag_inhibit_size_directive && DECL_SIZE (DECL))			\
541*404b540aSrobert     {									\
542*404b540aSrobert       size_directive_output = 1;					\
543*404b540aSrobert       ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME,				\
544*404b540aSrobert 				 int_size_in_bytes (TREE_TYPE (DECL)));	\
545*404b540aSrobert     }									\
546*404b540aSrobert   ASM_OUTPUT_LABEL(FILE, NAME);						\
547*404b540aSrobert } while (0)
548*404b540aSrobert 
549*404b540aSrobert #undef ASM_FINISH_DECLARE_OBJECT
550*404b540aSrobert #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)	 \
551*404b540aSrobert do {									 \
552*404b540aSrobert      const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);		 \
553*404b540aSrobert      HOST_WIDE_INT size;						 \
554*404b540aSrobert      if (!flag_inhibit_size_directive && DECL_SIZE (DECL)		 \
555*404b540aSrobert          && ! AT_END && TOP_LEVEL					 \
556*404b540aSrobert 	 && DECL_INITIAL (DECL) == error_mark_node			 \
557*404b540aSrobert 	 && !size_directive_output)					 \
558*404b540aSrobert        {								 \
559*404b540aSrobert 	 size_directive_output = 1;					 \
560*404b540aSrobert 	 size = int_size_in_bytes (TREE_TYPE (DECL));			 \
561*404b540aSrobert 	 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size);			 \
562*404b540aSrobert        }								 \
563*404b540aSrobert    } while (0)
564*404b540aSrobert 
565*404b540aSrobert 
566*404b540aSrobert #define ESCAPES \
567*404b540aSrobert "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
568*404b540aSrobert \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
569*404b540aSrobert \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
570*404b540aSrobert \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
571*404b540aSrobert \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
572*404b540aSrobert \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
573*404b540aSrobert \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
574*404b540aSrobert \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
575*404b540aSrobert /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
576*404b540aSrobert    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
577*404b540aSrobert    corresponds to a particular byte value [0..255].  For any
578*404b540aSrobert    given byte value, if the value in the corresponding table
579*404b540aSrobert    position is zero, the given character can be output directly.
580*404b540aSrobert    If the table value is 1, the byte must be output as a \ooo
581*404b540aSrobert    octal escape.  If the tables value is anything else, then the
582*404b540aSrobert    byte value should be output as a \ followed by the value
583*404b540aSrobert    in the table.  Note that we can use standard UN*X escape
584*404b540aSrobert    sequences for many control characters, but we don't use
585*404b540aSrobert    \a to represent BEL because some svr4 assemblers (e.g. on
586*404b540aSrobert    the i386) don't know about that.  Also, we don't use \v
587*404b540aSrobert    since some versions of gas, such as 2.2 did not accept it.  */
588*404b540aSrobert 
589*404b540aSrobert #define STRING_LIMIT	((unsigned) 64)
590*404b540aSrobert #define STRING_ASM_OP	"\t.string\t"
591*404b540aSrobert /* Some svr4 assemblers have a limit on the number of characters which
592*404b540aSrobert    can appear in the operand of a .string directive.  If your assembler
593*404b540aSrobert    has such a limitation, you should define STRING_LIMIT to reflect that
594*404b540aSrobert    limit.  Note that at least some svr4 assemblers have a limit on the
595*404b540aSrobert    actual number of bytes in the double-quoted string, and that they
596*404b540aSrobert    count each character in an escape sequence as one byte.  Thus, an
597*404b540aSrobert    escape sequence like \377 would count as four bytes.
598*404b540aSrobert 
599*404b540aSrobert    If your target assembler doesn't support the .string directive, you
600*404b540aSrobert    should define this to zero.  */
601*404b540aSrobert 
602*404b540aSrobert /* Globalizing directive for a label.  */
603*404b540aSrobert #define GLOBAL_ASM_OP ".global\t"
604*404b540aSrobert 
605*404b540aSrobert #define SET_ASM_OP	"\t.set\t"
606*404b540aSrobert 
607*404b540aSrobert #define ASM_WEAKEN_LABEL(FILE, NAME)	\
608*404b540aSrobert   do					\
609*404b540aSrobert     {					\
610*404b540aSrobert       fputs ("\t.weak\t", (FILE));	\
611*404b540aSrobert       assemble_name ((FILE), (NAME));	\
612*404b540aSrobert       fputc ('\n', (FILE));		\
613*404b540aSrobert     }					\
614*404b540aSrobert   while (0)
615*404b540aSrobert 
616*404b540aSrobert #define SUPPORTS_WEAK 1
617*404b540aSrobert 
618*404b540aSrobert #define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM)	\
619*404b540aSrobert sprintf (STRING, "*.%s%lu", PREFIX, (unsigned long)(NUM))
620*404b540aSrobert 
621*404b540aSrobert #define HAS_INIT_SECTION 1
622*404b540aSrobert 
623*404b540aSrobert #define REGISTER_NAMES {				\
624*404b540aSrobert   "r0","r1","r2","r3","r4","r5","r6","r7",		\
625*404b540aSrobert     "r8","r9","r10","r11","r12","r13","r14","r15",	\
626*404b540aSrobert     "r16","r17","r18","r19","r20","r21","r22","r23",	\
627*404b540aSrobert     "r24","r25","r26","r27","r28","r29","r30","r31",	\
628*404b540aSrobert     "__SPL__","__SPH__","argL","argH"}
629*404b540aSrobert 
630*404b540aSrobert #define FINAL_PRESCAN_INSN(insn, operand, nop) final_prescan_insn (insn, operand,nop)
631*404b540aSrobert 
632*404b540aSrobert #define PRINT_OPERAND(STREAM, X, CODE) print_operand (STREAM, X, CODE)
633*404b540aSrobert 
634*404b540aSrobert #define PRINT_OPERAND_PUNCT_VALID_P(CODE) ((CODE) == '~')
635*404b540aSrobert 
636*404b540aSrobert #define PRINT_OPERAND_ADDRESS(STREAM, X) print_operand_address(STREAM, X)
637*404b540aSrobert 
638*404b540aSrobert #define USER_LABEL_PREFIX ""
639*404b540aSrobert 
640*404b540aSrobert #define ASSEMBLER_DIALECT AVR_HAVE_MOVW
641*404b540aSrobert 
642*404b540aSrobert #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO)	\
643*404b540aSrobert {						\
644*404b540aSrobert   gcc_assert (REGNO < 32);			\
645*404b540aSrobert   fprintf (STREAM, "\tpush\tr%d", REGNO);	\
646*404b540aSrobert }
647*404b540aSrobert 
648*404b540aSrobert #define ASM_OUTPUT_REG_POP(STREAM, REGNO)	\
649*404b540aSrobert {						\
650*404b540aSrobert   gcc_assert (REGNO < 32);			\
651*404b540aSrobert   fprintf (STREAM, "\tpop\tr%d", REGNO);	\
652*404b540aSrobert }
653*404b540aSrobert 
654*404b540aSrobert #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE)		\
655*404b540aSrobert   avr_output_addr_vec_elt(STREAM, VALUE)
656*404b540aSrobert 
657*404b540aSrobert #define ASM_OUTPUT_CASE_LABEL(STREAM, PREFIX, NUM, TABLE) \
658*404b540aSrobert   (switch_to_section (progmem_section), \
659*404b540aSrobert    (*targetm.asm_out.internal_label) (STREAM, PREFIX, NUM))
660*404b540aSrobert 
661*404b540aSrobert #define ASM_OUTPUT_SKIP(STREAM, N)		\
662*404b540aSrobert fprintf (STREAM, "\t.skip %lu,0\n", (unsigned long)(N))
663*404b540aSrobert 
664*404b540aSrobert #define ASM_OUTPUT_ALIGN(STREAM, POWER)			\
665*404b540aSrobert   do {							\
666*404b540aSrobert       if ((POWER) > 1)					\
667*404b540aSrobert           fprintf (STREAM, "\t.p2align\t%d\n", POWER);	\
668*404b540aSrobert   } while (0)
669*404b540aSrobert 
670*404b540aSrobert #define CASE_VECTOR_MODE HImode
671*404b540aSrobert 
672*404b540aSrobert extern int avr_case_values_threshold;
673*404b540aSrobert 
674*404b540aSrobert #define CASE_VALUES_THRESHOLD avr_case_values_threshold
675*404b540aSrobert 
676*404b540aSrobert #undef WORD_REGISTER_OPERATIONS
677*404b540aSrobert 
678*404b540aSrobert #define MOVE_MAX 4
679*404b540aSrobert 
680*404b540aSrobert #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
681*404b540aSrobert 
682*404b540aSrobert #define Pmode HImode
683*404b540aSrobert 
684*404b540aSrobert #define FUNCTION_MODE HImode
685*404b540aSrobert 
686*404b540aSrobert #define DOLLARS_IN_IDENTIFIERS 0
687*404b540aSrobert 
688*404b540aSrobert #define NO_DOLLAR_IN_LABEL 1
689*404b540aSrobert 
690*404b540aSrobert #define TRAMPOLINE_TEMPLATE(FILE) \
691*404b540aSrobert   internal_error ("trampolines not supported")
692*404b540aSrobert 
693*404b540aSrobert #define TRAMPOLINE_SIZE 4
694*404b540aSrobert 
695*404b540aSrobert #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)			      \
696*404b540aSrobert {									      \
697*404b540aSrobert   emit_move_insn (gen_rtx_MEM (HImode, plus_constant ((TRAMP), 2)), CXT);    \
698*404b540aSrobert   emit_move_insn (gen_rtx_MEM (HImode, plus_constant ((TRAMP), 6)), FNADDR); \
699*404b540aSrobert }
700*404b540aSrobert /* Store in cc_status the expressions
701*404b540aSrobert    that the condition codes will describe
702*404b540aSrobert    after execution of an instruction whose pattern is EXP.
703*404b540aSrobert    Do not alter them if the instruction would not alter the cc's.  */
704*404b540aSrobert 
705*404b540aSrobert #define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc(EXP, INSN)
706*404b540aSrobert 
707*404b540aSrobert /* The add insns don't set overflow in a usable way.  */
708*404b540aSrobert #define CC_OVERFLOW_UNUSABLE 01000
709*404b540aSrobert /* The mov,and,or,xor insns don't set carry.  That's ok though as the
710*404b540aSrobert    Z bit is all we need when doing unsigned comparisons on the result of
711*404b540aSrobert    these insns (since they're always with 0).  However, conditions.h has
712*404b540aSrobert    CC_NO_OVERFLOW defined for this purpose.  Rename it to something more
713*404b540aSrobert    understandable.  */
714*404b540aSrobert #define CC_NO_CARRY CC_NO_OVERFLOW
715*404b540aSrobert 
716*404b540aSrobert 
717*404b540aSrobert /* Output assembler code to FILE to increment profiler label # LABELNO
718*404b540aSrobert    for profiling a function entry.  */
719*404b540aSrobert 
720*404b540aSrobert #define FUNCTION_PROFILER(FILE, LABELNO)  \
721*404b540aSrobert   fprintf (FILE, "/* profiler %d */", (LABELNO))
722*404b540aSrobert 
723*404b540aSrobert #define ADJUST_INSN_LENGTH(INSN, LENGTH) (LENGTH =\
724*404b540aSrobert 					  adjust_insn_length (INSN, LENGTH))
725*404b540aSrobert 
726*404b540aSrobert #define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
727*404b540aSrobert 
728*404b540aSrobert #define CC1_SPEC "%{profile:-p}"
729*404b540aSrobert 
730*404b540aSrobert #define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
731*404b540aSrobert     %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
732*404b540aSrobert     %{!fexceptions:-fno-exceptions}"
733*404b540aSrobert /* A C string constant that tells the GCC drvier program options to
734*404b540aSrobert    pass to `cc1plus'.  */
735*404b540aSrobert 
736*404b540aSrobert #define ASM_SPEC "%{mmcu=avr25:-mmcu=avr2;\
737*404b540aSrobert mmcu=*:-mmcu=%*}"
738*404b540aSrobert 
739*404b540aSrobert #define LINK_SPEC " %{!mmcu*:-m avr2}\
740*404b540aSrobert %{mmcu=at90s1200|\
741*404b540aSrobert   mmcu=attiny11|\
742*404b540aSrobert   mmcu=attiny12|\
743*404b540aSrobert   mmcu=attiny15|\
744*404b540aSrobert   mmcu=attiny28:-m avr1}\
745*404b540aSrobert %{mmcu=attiny22|\
746*404b540aSrobert   mmcu=attiny26|\
747*404b540aSrobert   mmcu=at90s2*|\
748*404b540aSrobert   mmcu=at90s4*|\
749*404b540aSrobert   mmcu=at90s8*|\
750*404b540aSrobert   mmcu=at90c8*|\
751*404b540aSrobert   mmcu=at86rf401|\
752*404b540aSrobert   mmcu=attiny13|\
753*404b540aSrobert   mmcu=attiny2313|\
754*404b540aSrobert   mmcu=attiny24|\
755*404b540aSrobert   mmcu=attiny25|\
756*404b540aSrobert   mmcu=attiny261|\
757*404b540aSrobert   mmcu=attiny4*|\
758*404b540aSrobert   mmcu=attiny8*:-m avr2}\
759*404b540aSrobert %{mmcu=atmega103|\
760*404b540aSrobert   mmcu=atmega603|\
761*404b540aSrobert   mmcu=at43*|\
762*404b540aSrobert   mmcu=at76*:-m avr3}\
763*404b540aSrobert %{mmcu=atmega8*|\
764*404b540aSrobert   mmcu=atmega48|\
765*404b540aSrobert   mmcu=at90pwm*:-m avr4}\
766*404b540aSrobert %{mmcu=atmega16*|\
767*404b540aSrobert   mmcu=atmega32*|\
768*404b540aSrobert   mmcu=atmega406|\
769*404b540aSrobert   mmcu=atmega64*|\
770*404b540aSrobert   mmcu=atmega128*|\
771*404b540aSrobert   mmcu=at90can*|\
772*404b540aSrobert   mmcu=at90usb*|\
773*404b540aSrobert   mmcu=at94k:-m avr5}\
774*404b540aSrobert %{mmcu=atmega324*|\
775*404b540aSrobert   mmcu=atmega325*|\
776*404b540aSrobert   mmcu=atmega329*|\
777*404b540aSrobert   mmcu=atmega406|\
778*404b540aSrobert   mmcu=atmega48|\
779*404b540aSrobert   mmcu=atmega88|\
780*404b540aSrobert   mmcu=atmega64|\
781*404b540aSrobert   mmcu=atmega644*|\
782*404b540aSrobert   mmcu=atmega645*|\
783*404b540aSrobert   mmcu=atmega649*|\
784*404b540aSrobert   mmcu=atmega128|\
785*404b540aSrobert   mmcu=atmega162|\
786*404b540aSrobert   mmcu=atmega164*|\
787*404b540aSrobert   mmcu=atmega165*|\
788*404b540aSrobert   mmcu=atmega168|\
789*404b540aSrobert   mmcu=atmega169*|\
790*404b540aSrobert   mmcu=atmega8hva|\
791*404b540aSrobert   mmcu=atmega16hva|\
792*404b540aSrobert   mmcu=at90can*|\
793*404b540aSrobert   mmcu=at90pwm*|\
794*404b540aSrobert   mmcu=at90usb*: -Tdata 0x800100}\
795*404b540aSrobert %{mmcu=atmega640|\
796*404b540aSrobert   mmcu=atmega1280|\
797*404b540aSrobert   mmcu=atmega1281: -Tdata 0x800200} "
798*404b540aSrobert 
799*404b540aSrobert #define LIB_SPEC \
800*404b540aSrobert   "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lc }}}}}"
801*404b540aSrobert 
802*404b540aSrobert #define LIBSTDCXX "-lgcc"
803*404b540aSrobert /* No libstdc++ for now.  Empty string doesn't work.  */
804*404b540aSrobert 
805*404b540aSrobert #define LIBGCC_SPEC \
806*404b540aSrobert   "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc }}}}}"
807*404b540aSrobert 
808*404b540aSrobert #define STARTFILE_SPEC "%(crt_binutils)"
809*404b540aSrobert 
810*404b540aSrobert #define ENDFILE_SPEC ""
811*404b540aSrobert 
812*404b540aSrobert #define CRT_BINUTILS_SPECS "\
813*404b540aSrobert %{mmcu=at90s1200|mmcu=avr1:crts1200.o%s} \
814*404b540aSrobert %{mmcu=attiny11:crttn11.o%s} \
815*404b540aSrobert %{mmcu=attiny12:crttn12.o%s} \
816*404b540aSrobert %{mmcu=attiny15:crttn15.o%s} \
817*404b540aSrobert %{mmcu=attiny28:crttn28.o%s} \
818*404b540aSrobert %{!mmcu*|mmcu=at90s8515|mmcu=avr2:crts8515.o%s} \
819*404b540aSrobert %{mmcu=at90s2313:crts2313.o%s} \
820*404b540aSrobert %{mmcu=at90s2323:crts2323.o%s} \
821*404b540aSrobert %{mmcu=at90s2333:crts2333.o%s} \
822*404b540aSrobert %{mmcu=at90s2343:crts2343.o%s} \
823*404b540aSrobert %{mmcu=attiny22:crttn22.o%s} \
824*404b540aSrobert %{mmcu=attiny26:crttn26.o%s} \
825*404b540aSrobert %{mmcu=at90s4433:crts4433.o%s} \
826*404b540aSrobert %{mmcu=at90s4414:crts4414.o%s} \
827*404b540aSrobert %{mmcu=at90s4434:crts4434.o%s} \
828*404b540aSrobert %{mmcu=at90c8534:crtc8534.o%s} \
829*404b540aSrobert %{mmcu=at90s8535:crts8535.o%s} \
830*404b540aSrobert %{mmcu=at86rf401:crt86401.o%s} \
831*404b540aSrobert %{mmcu=attiny13:crttn13.o%s} \
832*404b540aSrobert %{mmcu=attiny2313|mmcu=avr25:crttn2313.o%s} \
833*404b540aSrobert %{mmcu=attiny24:crttn24.o%s} \
834*404b540aSrobert %{mmcu=attiny44:crttn44.o%s} \
835*404b540aSrobert %{mmcu=attiny84:crttn84.o%s} \
836*404b540aSrobert %{mmcu=attiny25:crttn25.o%s} \
837*404b540aSrobert %{mmcu=attiny45:crttn45.o%s} \
838*404b540aSrobert %{mmcu=attiny85:crttn85.o%s} \
839*404b540aSrobert %{mmcu=attiny261:crttn261.o%s} \
840*404b540aSrobert %{mmcu=attiny461:crttn461.o%s} \
841*404b540aSrobert %{mmcu=attiny861:crttn861.o%s} \
842*404b540aSrobert %{mmcu=atmega103|mmcu=avr3:crtm103.o%s} \
843*404b540aSrobert %{mmcu=atmega603:crtm603.o%s} \
844*404b540aSrobert %{mmcu=at43usb320:crt43320.o%s} \
845*404b540aSrobert %{mmcu=at43usb355:crt43355.o%s} \
846*404b540aSrobert %{mmcu=at76c711:crt76711.o%s} \
847*404b540aSrobert %{mmcu=atmega8|mmcu=avr4:crtm8.o%s} \
848*404b540aSrobert %{mmcu=atmega48:crtm48.o%s} \
849*404b540aSrobert %{mmcu=atmega88:crtm88.o%s} \
850*404b540aSrobert %{mmcu=atmega8515:crtm8515.o%s} \
851*404b540aSrobert %{mmcu=atmega8535:crtm8535.o%s} \
852*404b540aSrobert %{mmcu=at90pwm1:crt90pwm1.o%s} \
853*404b540aSrobert %{mmcu=at90pwm2:crt90pwm2.o%s} \
854*404b540aSrobert %{mmcu=at90pwm3:crt90pwm3.o%s} \
855*404b540aSrobert %{mmcu=atmega16:crtm16.o%s} \
856*404b540aSrobert %{mmcu=atmega161|mmcu=avr5:crtm161.o%s} \
857*404b540aSrobert %{mmcu=atmega162:crtm162.o%s} \
858*404b540aSrobert %{mmcu=atmega163:crtm163.o%s} \
859*404b540aSrobert %{mmcu=atmega164p:crtm164p.o%s} \
860*404b540aSrobert %{mmcu=atmega165:crtm165.o%s} \
861*404b540aSrobert %{mmcu=atmega165p:crtm165p.o%s} \
862*404b540aSrobert %{mmcu=atmega168:crtm168.o%s} \
863*404b540aSrobert %{mmcu=atmega169:crtm169.o%s} \
864*404b540aSrobert %{mmcu=atmega169p:crtm169p.o%s} \
865*404b540aSrobert %{mmcu=atmega32:crtm32.o%s} \
866*404b540aSrobert %{mmcu=atmega323:crtm323.o%s} \
867*404b540aSrobert %{mmcu=atmega324p:crtm324p.o%s} \
868*404b540aSrobert %{mmcu=atmega325:crtm325.o%s} \
869*404b540aSrobert %{mmcu=atmega325p:crtm325p.o%s} \
870*404b540aSrobert %{mmcu=atmega3250:crtm3250.o%s} \
871*404b540aSrobert %{mmcu=atmega3250p:crtm3250p.o%s} \
872*404b540aSrobert %{mmcu=atmega329:crtm329.o%s} \
873*404b540aSrobert %{mmcu=atmega329p:crtm329p.o%s} \
874*404b540aSrobert %{mmcu=atmega3290:crtm3290.o%s} \
875*404b540aSrobert %{mmcu=atmega3290p:crtm3290p.o%s} \
876*404b540aSrobert %{mmcu=atmega406:crtm406.o%s} \
877*404b540aSrobert %{mmcu=atmega64:crtm64.o%s} \
878*404b540aSrobert %{mmcu=atmega640:crtm640.o%s} \
879*404b540aSrobert %{mmcu=atmega644:crtm644.o%s} \
880*404b540aSrobert %{mmcu=atmega644p:crtm644p.o%s} \
881*404b540aSrobert %{mmcu=atmega645:crtm645.o%s} \
882*404b540aSrobert %{mmcu=atmega6450:crtm6450.o%s} \
883*404b540aSrobert %{mmcu=atmega649:crtm649.o%s} \
884*404b540aSrobert %{mmcu=atmega6490:crtm6490.o%s} \
885*404b540aSrobert %{mmcu=atmega128:crtm128.o%s} \
886*404b540aSrobert %{mmcu=atmega1280:crtm1280.o%s} \
887*404b540aSrobert %{mmcu=atmega1281:crtm1281.o%s} \
888*404b540aSrobert %{mmcu=atmega8hva:crtm8hva.o%s} \
889*404b540aSrobert %{mmcu=atmega16hva:crtm16hva.o%s} \
890*404b540aSrobert %{mmcu=at90can32:crtcan32.o%s} \
891*404b540aSrobert %{mmcu=at90can64:crtcan64.o%s} \
892*404b540aSrobert %{mmcu=at90can128:crtcan128.o%s} \
893*404b540aSrobert %{mmcu=at90usb82:crtusb82.o%s} \
894*404b540aSrobert %{mmcu=at90usb162:crtusb162.o%s} \
895*404b540aSrobert %{mmcu=at90usb646:crtusb646.o%s} \
896*404b540aSrobert %{mmcu=at90usb647:crtusb647.o%s} \
897*404b540aSrobert %{mmcu=at90usb1286:crtusb1286.o%s} \
898*404b540aSrobert %{mmcu=at90usb1287:crtusb1287.o%s} \
899*404b540aSrobert %{mmcu=at94k:crtat94k.o%s}"
900*404b540aSrobert 
901*404b540aSrobert #define EXTRA_SPECS {"crt_binutils", CRT_BINUTILS_SPECS},
902*404b540aSrobert 
903*404b540aSrobert /* This is the default without any -mmcu=* option (AT90S*).  */
904*404b540aSrobert #define MULTILIB_DEFAULTS { "mmcu=avr2" }
905*404b540aSrobert 
906*404b540aSrobert /* This is undefined macro for collect2 disabling */
907*404b540aSrobert #define LINKER_NAME "ld"
908*404b540aSrobert 
909*404b540aSrobert #define TEST_HARD_REG_CLASS(CLASS, REGNO) \
910*404b540aSrobert   TEST_HARD_REG_BIT (reg_class_contents[ (int) (CLASS)], REGNO)
911*404b540aSrobert 
912*404b540aSrobert /* Note that the other files fail to use these
913*404b540aSrobert    in some of the places where they should.  */
914*404b540aSrobert 
915*404b540aSrobert #if defined(__STDC__) || defined(ALMOST_STDC)
916*404b540aSrobert #define AS2(a,b,c) #a " " #b "," #c
917*404b540aSrobert #define AS2C(b,c) " " #b "," #c
918*404b540aSrobert #define AS3(a,b,c,d) #a " " #b "," #c "," #d
919*404b540aSrobert #define AS1(a,b) #a " " #b
920*404b540aSrobert #else
921*404b540aSrobert #define AS1(a,b) "a	b"
922*404b540aSrobert #define AS2(a,b,c) "a	b,c"
923*404b540aSrobert #define AS2C(b,c) " b,c"
924*404b540aSrobert #define AS3(a,b,c,d) "a	b,c,d"
925*404b540aSrobert #endif
926*404b540aSrobert #define OUT_AS1(a,b) output_asm_insn (AS1(a,b), operands)
927*404b540aSrobert #define OUT_AS2(a,b,c) output_asm_insn (AS2(a,b,c), operands)
928*404b540aSrobert #define CR_TAB "\n\t"
929*404b540aSrobert 
930*404b540aSrobert #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
931*404b540aSrobert 
932*404b540aSrobert #define DWARF2_DEBUGGING_INFO 1
933*404b540aSrobert 
934*404b540aSrobert #define DWARF2_ADDR_SIZE 4
935*404b540aSrobert 
936*404b540aSrobert #define OBJECT_FORMAT_ELF
937