OSDN Git Service

* config/avr/avr.c (avr_mcu_types): Add attiny48.
[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, STR) ((C) == '\n' || ((C) == '$'))
486
487 #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)                     \
488 do {                                                                       \
489      fputs ("\t.comm ", (STREAM));                                         \
490      assemble_name ((STREAM), (NAME));                                     \
491      fprintf ((STREAM), ",%lu,1\n", (unsigned long)(SIZE));                \
492 } while (0)
493
494 #define ASM_OUTPUT_BSS(FILE, DECL, NAME, SIZE, ROUNDED)                 \
495   asm_output_bss ((FILE), (DECL), (NAME), (SIZE), (ROUNDED))
496
497 #define ASM_OUTPUT_LOCAL(STREAM, NAME, SIZE, ROUNDED)                   \
498 do {                                                                    \
499      fputs ("\t.lcomm ", (STREAM));                                     \
500      assemble_name ((STREAM), (NAME));                                  \
501      fprintf ((STREAM), ",%d\n", (int)(SIZE));                          \
502 } while (0)
503
504 #undef TYPE_ASM_OP
505 #undef SIZE_ASM_OP
506 #undef WEAK_ASM_OP
507 #define TYPE_ASM_OP     "\t.type\t"
508 #define SIZE_ASM_OP     "\t.size\t"
509 #define WEAK_ASM_OP     "\t.weak\t"
510 /* Define the strings used for the special svr4 .type and .size directives.
511    These strings generally do not vary from one system running svr4 to
512    another, but if a given system (e.g. m88k running svr) needs to use
513    different pseudo-op names for these, they may be overridden in the
514    file which includes this one.  */
515
516
517 #undef TYPE_OPERAND_FMT
518 #define TYPE_OPERAND_FMT        "@%s"
519 /* The following macro defines the format used to output the second
520    operand of the .type assembler directive.  Different svr4 assemblers
521    expect various different forms for this operand.  The one given here
522    is just a default.  You may need to override it in your machine-
523    specific tm.h file (depending upon the particulars of your assembler).  */
524
525 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)             \
526 do {                                                            \
527      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");        \
528      ASM_OUTPUT_LABEL (FILE, NAME);                             \
529 } while (0)
530
531 #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)                    \
532   do {                                                                  \
533     if (!flag_inhibit_size_directive)                                   \
534       ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);                           \
535   } while (0)
536
537 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
538 do {                                                                    \
539   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");                     \
540   size_directive_output = 0;                                            \
541   if (!flag_inhibit_size_directive && DECL_SIZE (DECL))                 \
542     {                                                                   \
543       size_directive_output = 1;                                        \
544       ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME,                            \
545                                  int_size_in_bytes (TREE_TYPE (DECL))); \
546     }                                                                   \
547   ASM_OUTPUT_LABEL(FILE, NAME);                                         \
548 } while (0)
549
550 #undef ASM_FINISH_DECLARE_OBJECT
551 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)         \
552 do {                                                                     \
553      const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);             \
554      HOST_WIDE_INT size;                                                 \
555      if (!flag_inhibit_size_directive && DECL_SIZE (DECL)                \
556          && ! AT_END && TOP_LEVEL                                        \
557          && DECL_INITIAL (DECL) == error_mark_node                       \
558          && !size_directive_output)                                      \
559        {                                                                 \
560          size_directive_output = 1;                                      \
561          size = int_size_in_bytes (TREE_TYPE (DECL));                    \
562          ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size);                   \
563        }                                                                 \
564    } while (0)
565
566
567 #define ESCAPES \
568 "\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\
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\
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\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 \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 /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
577    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
578    corresponds to a particular byte value [0..255].  For any
579    given byte value, if the value in the corresponding table
580    position is zero, the given character can be output directly.
581    If the table value is 1, the byte must be output as a \ooo
582    octal escape.  If the tables value is anything else, then the
583    byte value should be output as a \ followed by the value
584    in the table.  Note that we can use standard UN*X escape
585    sequences for many control characters, but we don't use
586    \a to represent BEL because some svr4 assemblers (e.g. on
587    the i386) don't know about that.  Also, we don't use \v
588    since some versions of gas, such as 2.2 did not accept it.  */
589
590 #define STRING_LIMIT    ((unsigned) 64)
591 #define STRING_ASM_OP   "\t.string\t"
592 /* Some svr4 assemblers have a limit on the number of characters which
593    can appear in the operand of a .string directive.  If your assembler
594    has such a limitation, you should define STRING_LIMIT to reflect that
595    limit.  Note that at least some svr4 assemblers have a limit on the
596    actual number of bytes in the double-quoted string, and that they
597    count each character in an escape sequence as one byte.  Thus, an
598    escape sequence like \377 would count as four bytes.
599
600    If your target assembler doesn't support the .string directive, you
601    should define this to zero.  */
602
603 /* Globalizing directive for a label.  */
604 #define GLOBAL_ASM_OP ".global\t"
605
606 #define SET_ASM_OP      "\t.set\t"
607
608 #define ASM_WEAKEN_LABEL(FILE, NAME)    \
609   do                                    \
610     {                                   \
611       fputs ("\t.weak\t", (FILE));      \
612       assemble_name ((FILE), (NAME));   \
613       fputc ('\n', (FILE));             \
614     }                                   \
615   while (0)
616
617 #define SUPPORTS_WEAK 1
618
619 #define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM)        \
620 sprintf (STRING, "*.%s%lu", PREFIX, (unsigned long)(NUM))
621
622 #define HAS_INIT_SECTION 1
623
624 #define REGISTER_NAMES {                                \
625   "r0","r1","r2","r3","r4","r5","r6","r7",              \
626     "r8","r9","r10","r11","r12","r13","r14","r15",      \
627     "r16","r17","r18","r19","r20","r21","r22","r23",    \
628     "r24","r25","r26","r27","r28","r29","r30","r31",    \
629     "__SP_L__","__SP_H__","argL","argH"}
630
631 #define FINAL_PRESCAN_INSN(insn, operand, nop) final_prescan_insn (insn, operand,nop)
632
633 #define PRINT_OPERAND(STREAM, X, CODE) print_operand (STREAM, X, CODE)
634
635 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) ((CODE) == '~')
636
637 #define PRINT_OPERAND_ADDRESS(STREAM, X) print_operand_address(STREAM, X)
638
639 #define USER_LABEL_PREFIX ""
640
641 #define ASSEMBLER_DIALECT AVR_HAVE_MOVW
642
643 #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO)      \
644 {                                               \
645   gcc_assert (REGNO < 32);                      \
646   fprintf (STREAM, "\tpush\tr%d", REGNO);       \
647 }
648
649 #define ASM_OUTPUT_REG_POP(STREAM, REGNO)       \
650 {                                               \
651   gcc_assert (REGNO < 32);                      \
652   fprintf (STREAM, "\tpop\tr%d", REGNO);        \
653 }
654
655 #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE)          \
656   avr_output_addr_vec_elt(STREAM, VALUE)
657
658 #define ASM_OUTPUT_CASE_LABEL(STREAM, PREFIX, NUM, TABLE) \
659   (switch_to_section (progmem_section), \
660    (*targetm.asm_out.internal_label) (STREAM, PREFIX, NUM))
661
662 #define ASM_OUTPUT_SKIP(STREAM, N)              \
663 fprintf (STREAM, "\t.skip %lu,0\n", (unsigned long)(N))
664
665 #define ASM_OUTPUT_ALIGN(STREAM, POWER)                 \
666   do {                                                  \
667       if ((POWER) > 1)                                  \
668           fprintf (STREAM, "\t.p2align\t%d\n", POWER);  \
669   } while (0)
670
671 #define CASE_VECTOR_MODE HImode
672
673 extern int avr_case_values_threshold;
674
675 #define CASE_VALUES_THRESHOLD avr_case_values_threshold
676
677 #undef WORD_REGISTER_OPERATIONS
678
679 #define MOVE_MAX 4
680
681 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
682
683 #define Pmode HImode
684
685 #define FUNCTION_MODE HImode
686
687 #define DOLLARS_IN_IDENTIFIERS 0
688
689 #define NO_DOLLAR_IN_LABEL 1
690
691 #define TRAMPOLINE_TEMPLATE(FILE) \
692   internal_error ("trampolines not supported")
693
694 #define TRAMPOLINE_SIZE 4
695
696 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)                             \
697 {                                                                             \
698   emit_move_insn (gen_rtx_MEM (HImode, plus_constant ((TRAMP), 2)), CXT);    \
699   emit_move_insn (gen_rtx_MEM (HImode, plus_constant ((TRAMP), 6)), FNADDR); \
700 }
701 /* Store in cc_status the expressions
702    that the condition codes will describe
703    after execution of an instruction whose pattern is EXP.
704    Do not alter them if the instruction would not alter the cc's.  */
705
706 #define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc(EXP, INSN)
707
708 /* The add insns don't set overflow in a usable way.  */
709 #define CC_OVERFLOW_UNUSABLE 01000
710 /* The mov,and,or,xor insns don't set carry.  That's ok though as the
711    Z bit is all we need when doing unsigned comparisons on the result of
712    these insns (since they're always with 0).  However, conditions.h has
713    CC_NO_OVERFLOW defined for this purpose.  Rename it to something more
714    understandable.  */
715 #define CC_NO_CARRY CC_NO_OVERFLOW
716
717
718 /* Output assembler code to FILE to increment profiler label # LABELNO
719    for profiling a function entry.  */
720
721 #define FUNCTION_PROFILER(FILE, LABELNO)  \
722   fprintf (FILE, "/* profiler %d */", (LABELNO))
723
724 #define ADJUST_INSN_LENGTH(INSN, LENGTH) (LENGTH =\
725                                           adjust_insn_length (INSN, LENGTH))
726
727 #define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
728
729 #define CC1_SPEC "%{profile:-p}"
730
731 #define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
732     %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
733     %{!fexceptions:-fno-exceptions}"
734 /* A C string constant that tells the GCC driver program options to
735    pass to `cc1plus'.  */
736
737 #define ASM_SPEC "%{mmcu=avr25:-mmcu=avr2;\
738 mmcu=*:-mmcu=%*}"
739
740 #define LINK_SPEC " %{!mmcu*:-m avr2}\
741 %{mmcu=at90s1200|\
742   mmcu=attiny11|\
743   mmcu=attiny12|\
744   mmcu=attiny15|\
745   mmcu=attiny28:-m avr1}\
746 %{mmcu=attiny22|\
747   mmcu=attiny26|\
748   mmcu=at90s2*|\
749   mmcu=at90s4*|\
750   mmcu=at90s8*|\
751   mmcu=at90c8*|\
752   mmcu=at86rf401|\
753   mmcu=attiny13|\
754   mmcu=attiny2313|\
755   mmcu=attiny24|\
756   mmcu=attiny25|\
757   mmcu=attiny261|\
758   mmcu=attiny4*|\
759   mmcu=attiny8*:-m avr2}\
760 %{mmcu=atmega103|\
761   mmcu=atmega603|\
762   mmcu=at43*|\
763   mmcu=at76*:-m avr3}\
764 %{mmcu=atmega8*|\
765   mmcu=atmega48|\
766   mmcu=at90pwm1|\
767   mmcu=at90pwm2|\
768   mmcu=at90pwm3:-m avr4}\
769 %{mmcu=atmega16*|\
770   mmcu=atmega32*|\
771   mmcu=atmega406|\
772   mmcu=atmega64*|\
773   mmcu=atmega128*|\
774   mmcu=at90can*|\
775   mmcu=at90pwm216|\
776   mmcu=at90pwm316|\
777   mmcu=at90usb*|\
778   mmcu=at94k:-m avr5}\
779 %{mmcu=atmega324*|\
780   mmcu=atmega325*|\
781   mmcu=atmega329*|\
782   mmcu=atmega406|\
783   mmcu=atmega48|\
784   mmcu=atmega88|\
785   mmcu=atmega64|\
786   mmcu=atmega644*|\
787   mmcu=atmega645*|\
788   mmcu=atmega649*|\
789   mmcu=atmega128|\
790   mmcu=atmega162|\
791   mmcu=atmega164*|\
792   mmcu=atmega165*|\
793   mmcu=atmega168|\
794   mmcu=atmega169*|\
795   mmcu=atmega8hva|\
796   mmcu=atmega16hva|\
797   mmcu=attiny48|\
798   mmcu=at90can*|\
799   mmcu=at90pwm*|\
800   mmcu=at90usb*: -Tdata 0x800100}\
801 %{mmcu=atmega640|\
802   mmcu=atmega1280|\
803   mmcu=atmega1281: -Tdata 0x800200} "
804
805 #define LIB_SPEC \
806   "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lc }}}}}"
807
808 #define LIBSTDCXX "-lgcc"
809 /* No libstdc++ for now.  Empty string doesn't work.  */
810
811 #define LIBGCC_SPEC \
812   "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc }}}}}"
813
814 #define STARTFILE_SPEC "%(crt_binutils)"
815
816 #define ENDFILE_SPEC ""
817
818 #define CRT_BINUTILS_SPECS "\
819 %{mmcu=at90s1200|mmcu=avr1:crts1200.o%s} \
820 %{mmcu=attiny11:crttn11.o%s} \
821 %{mmcu=attiny12:crttn12.o%s} \
822 %{mmcu=attiny15:crttn15.o%s} \
823 %{mmcu=attiny28:crttn28.o%s} \
824 %{!mmcu*|mmcu=at90s8515|mmcu=avr2:crts8515.o%s} \
825 %{mmcu=at90s2313:crts2313.o%s} \
826 %{mmcu=at90s2323:crts2323.o%s} \
827 %{mmcu=at90s2333:crts2333.o%s} \
828 %{mmcu=at90s2343:crts2343.o%s} \
829 %{mmcu=attiny22:crttn22.o%s} \
830 %{mmcu=attiny26:crttn26.o%s} \
831 %{mmcu=at90s4433:crts4433.o%s} \
832 %{mmcu=at90s4414:crts4414.o%s} \
833 %{mmcu=at90s4434:crts4434.o%s} \
834 %{mmcu=at90c8534:crtc8534.o%s} \
835 %{mmcu=at90s8535:crts8535.o%s} \
836 %{mmcu=at86rf401:crt86401.o%s} \
837 %{mmcu=attiny13:crttn13.o%s} \
838 %{mmcu=attiny2313|mmcu=avr25:crttn2313.o%s} \
839 %{mmcu=attiny24:crttn24.o%s} \
840 %{mmcu=attiny44:crttn44.o%s} \
841 %{mmcu=attiny84:crttn84.o%s} \
842 %{mmcu=attiny25:crttn25.o%s} \
843 %{mmcu=attiny45:crttn45.o%s} \
844 %{mmcu=attiny85:crttn85.o%s} \
845 %{mmcu=attiny261:crttn261.o%s} \
846 %{mmcu=attiny461:crttn461.o%s} \
847 %{mmcu=attiny861:crttn861.o%s} \
848 %{mmcu=attiny43u:crttn43u.o%s} \
849 %{mmcu=attiny48:crttn48.o%s} \
850 %{mmcu=atmega103|mmcu=avr3:crtm103.o%s} \
851 %{mmcu=atmega603:crtm603.o%s} \
852 %{mmcu=at43usb320:crt43320.o%s} \
853 %{mmcu=at43usb355:crt43355.o%s} \
854 %{mmcu=at76c711:crt76711.o%s} \
855 %{mmcu=atmega8|mmcu=avr4:crtm8.o%s} \
856 %{mmcu=atmega48:crtm48.o%s} \
857 %{mmcu=atmega88:crtm88.o%s} \
858 %{mmcu=atmega8515:crtm8515.o%s} \
859 %{mmcu=atmega8535:crtm8535.o%s} \
860 %{mmcu=at90pwm1:crt90pwm1.o%s} \
861 %{mmcu=at90pwm2:crt90pwm2.o%s} \
862 %{mmcu=at90pwm3:crt90pwm3.o%s} \
863 %{mmcu=atmega16:crtm16.o%s} \
864 %{mmcu=atmega161|mmcu=avr5:crtm161.o%s} \
865 %{mmcu=atmega162:crtm162.o%s} \
866 %{mmcu=atmega163:crtm163.o%s} \
867 %{mmcu=atmega164p:crtm164p.o%s} \
868 %{mmcu=atmega165:crtm165.o%s} \
869 %{mmcu=atmega165p:crtm165p.o%s} \
870 %{mmcu=atmega168:crtm168.o%s} \
871 %{mmcu=atmega169:crtm169.o%s} \
872 %{mmcu=atmega169p:crtm169p.o%s} \
873 %{mmcu=atmega32:crtm32.o%s} \
874 %{mmcu=atmega323:crtm323.o%s} \
875 %{mmcu=atmega324p:crtm324p.o%s} \
876 %{mmcu=atmega325:crtm325.o%s} \
877 %{mmcu=atmega325p:crtm325p.o%s} \
878 %{mmcu=atmega3250:crtm3250.o%s} \
879 %{mmcu=atmega3250p:crtm3250p.o%s} \
880 %{mmcu=atmega329:crtm329.o%s} \
881 %{mmcu=atmega329p:crtm329p.o%s} \
882 %{mmcu=atmega3290:crtm3290.o%s} \
883 %{mmcu=atmega3290p:crtm3290p.o%s} \
884 %{mmcu=atmega406:crtm406.o%s} \
885 %{mmcu=atmega64:crtm64.o%s} \
886 %{mmcu=atmega640:crtm640.o%s} \
887 %{mmcu=atmega644:crtm644.o%s} \
888 %{mmcu=atmega644p:crtm644p.o%s} \
889 %{mmcu=atmega645:crtm645.o%s} \
890 %{mmcu=atmega6450:crtm6450.o%s} \
891 %{mmcu=atmega649:crtm649.o%s} \
892 %{mmcu=atmega6490:crtm6490.o%s} \
893 %{mmcu=atmega128:crtm128.o%s} \
894 %{mmcu=atmega1280:crtm1280.o%s} \
895 %{mmcu=atmega1281:crtm1281.o%s} \
896 %{mmcu=atmega8hva:crtm8hva.o%s} \
897 %{mmcu=atmega16hva:crtm16hva.o%s} \
898 %{mmcu=at90can32:crtcan32.o%s} \
899 %{mmcu=at90can64:crtcan64.o%s} \
900 %{mmcu=at90can128:crtcan128.o%s} \
901 %{mmcu=at90pwm216:crt90pwm216.o%s} \
902 %{mmcu=at90pwm316:crt90pwm316.o%s} \
903 %{mmcu=at90usb82:crtusb82.o%s} \
904 %{mmcu=at90usb162:crtusb162.o%s} \
905 %{mmcu=at90usb646:crtusb646.o%s} \
906 %{mmcu=at90usb647:crtusb647.o%s} \
907 %{mmcu=at90usb1286:crtusb1286.o%s} \
908 %{mmcu=at90usb1287:crtusb1287.o%s} \
909 %{mmcu=at94k:crtat94k.o%s}"
910
911 #define EXTRA_SPECS {"crt_binutils", CRT_BINUTILS_SPECS},
912
913 /* This is the default without any -mmcu=* option (AT90S*).  */
914 #define MULTILIB_DEFAULTS { "mmcu=avr2" }
915
916 /* This is undefined macro for collect2 disabling */
917 #define LINKER_NAME "ld"
918
919 #define TEST_HARD_REG_CLASS(CLASS, REGNO) \
920   TEST_HARD_REG_BIT (reg_class_contents[ (int) (CLASS)], REGNO)
921
922 /* Note that the other files fail to use these
923    in some of the places where they should.  */
924
925 #if defined(__STDC__) || defined(ALMOST_STDC)
926 #define AS2(a,b,c) #a " " #b "," #c
927 #define AS2C(b,c) " " #b "," #c
928 #define AS3(a,b,c,d) #a " " #b "," #c "," #d
929 #define AS1(a,b) #a " " #b
930 #else
931 #define AS1(a,b) "a     b"
932 #define AS2(a,b,c) "a   b,c"
933 #define AS2C(b,c) " b,c"
934 #define AS3(a,b,c,d) "a b,c,d"
935 #endif
936 #define OUT_AS1(a,b) output_asm_insn (AS1(a,b), operands)
937 #define OUT_AS2(a,b,c) output_asm_insn (AS2(a,b,c), operands)
938 #define CR_TAB "\n\t"
939
940 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
941
942 #define DWARF2_DEBUGGING_INFO 1
943
944 #define DWARF2_ADDR_SIZE 4
945
946 #define OBJECT_FORMAT_ELF
947
948 /* A C structure for machine-specific, per-function data.
949    This is added to the cfun structure.  */
950 struct machine_function GTY(())
951 {
952   /* 'true' - if current function is a 'main' function.  */
953   int is_main;
954
955   /* 'true' - if current function is a naked function.  */
956   int is_naked;
957
958   /* 'true' - if current function is an interrupt function 
959      as specified by the "interrupt" attribute.  */
960   int is_interrupt;
961
962   /* 'true' - if current function is a signal function 
963      as specified by the "signal" attribute.  */
964   int is_signal;
965 };