OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [config/] [avr/] [avr.h] - Blame information for rev 820

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* 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_enhanced_p)                       \
40
        builtin_define ("__AVR_ENHANCED__");    \
41
      if (avr_enhanced_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_enhanced_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_ENHANCED (avr_enhanced_p)
62
#define AVR_HAVE_MOVW (avr_have_movw_lpmx_p)
63
 
64
#define TARGET_VERSION fprintf (stderr, " (GNU assembler syntax)");
65
 
66
#define OVERRIDE_OPTIONS avr_override_options ()
67
 
68
#define CAN_DEBUG_WITHOUT_FP
69
 
70
#define BITS_BIG_ENDIAN 0
71
#define BYTES_BIG_ENDIAN 0
72
#define WORDS_BIG_ENDIAN 0
73
 
74
#ifdef IN_LIBGCC2
75
/* This is to get correct SI and DI modes in libgcc2.c (32 and 64 bits).  */
76
#define UNITS_PER_WORD 4
77
#else
78
/* Width of a word, in units (bytes).  */
79
#define UNITS_PER_WORD 1
80
#endif
81
 
82
#define POINTER_SIZE 16
83
 
84
 
85
/* Maximum sized of reasonable data type
86
   DImode or Dfmode ...  */
87
#define MAX_FIXED_MODE_SIZE 32
88
 
89
#define PARM_BOUNDARY 8
90
 
91
#define FUNCTION_BOUNDARY 8
92
 
93
#define EMPTY_FIELD_BOUNDARY 8
94
 
95
/* No data type wants to be aligned rounder than this.  */
96
#define BIGGEST_ALIGNMENT 8
97
 
98
#define TARGET_VTABLE_ENTRY_ALIGN 8
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.