OSDN Git Service

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