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