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