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