1*404b540aSrobert /* Target Definitions for R8C/M16C/M32C 2*404b540aSrobert Copyright (C) 2005 3*404b540aSrobert Free Software Foundation, Inc. 4*404b540aSrobert Contributed by Red Hat. 5*404b540aSrobert 6*404b540aSrobert This file is part of GCC. 7*404b540aSrobert 8*404b540aSrobert GCC is free software; you can redistribute it and/or modify it 9*404b540aSrobert under the terms of the GNU General Public License as published 10*404b540aSrobert by the Free Software Foundation; either version 2, or (at your 11*404b540aSrobert option) any later version. 12*404b540aSrobert 13*404b540aSrobert GCC is distributed in the hope that it will be useful, but WITHOUT 14*404b540aSrobert ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15*404b540aSrobert or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16*404b540aSrobert License for more details. 17*404b540aSrobert 18*404b540aSrobert You should have received a copy of the GNU General Public License 19*404b540aSrobert along with GCC; see the file COPYING. If not, write to the Free 20*404b540aSrobert Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 21*404b540aSrobert 02110-1301, USA. */ 22*404b540aSrobert 23*404b540aSrobert #ifndef GCC_M32C_H 24*404b540aSrobert #define GCC_M32C_H 25*404b540aSrobert 26*404b540aSrobert /* Controlling the Compilation Driver, `gcc'. */ 27*404b540aSrobert 28*404b540aSrobert #undef STARTFILE_SPEC 29*404b540aSrobert #define STARTFILE_SPEC "crt0.o%s crtbegin.o%s" 30*404b540aSrobert 31*404b540aSrobert /* There are four CPU series we support, but they basically break down 32*404b540aSrobert into two families - the R8C/M16C families, with 16 bit address 33*404b540aSrobert registers and one set of opcodes, and the M32CM/M32C group, with 24 34*404b540aSrobert bit address registers and a different set of opcodes. The 35*404b540aSrobert assembler doesn't care except for which opcode set is needed; the 36*404b540aSrobert big difference is in the memory maps, which we cover in 37*404b540aSrobert LIB_SPEC. */ 38*404b540aSrobert 39*404b540aSrobert #undef ASM_SPEC 40*404b540aSrobert #define ASM_SPEC "\ 41*404b540aSrobert %{mcpu=r8c:--m16c} \ 42*404b540aSrobert %{mcpu=m16c:--m16c} \ 43*404b540aSrobert %{mcpu=m32cm:--m32c} \ 44*404b540aSrobert %{mcpu=m32c:--m32c} " 45*404b540aSrobert 46*404b540aSrobert /* The default is R8C hardware. We support a simulator, which has its 47*404b540aSrobert own libgloss and link map, plus one default link map for each chip 48*404b540aSrobert family. Most of the logic here is making sure we do the right 49*404b540aSrobert thing when no CPU is specified, which defaults to R8C. */ 50*404b540aSrobert #undef LIB_SPEC 51*404b540aSrobert #define LIB_SPEC "-( -lc %{msim*:-lsim}%{!msim*:-lnosys} -) \ 52*404b540aSrobert %{msim*:%{!T*: %{mcpu=m32cm:-Tsim24.ld}%{mcpu=m32c:-Tsim24.ld} \ 53*404b540aSrobert %{!mcpu=m32cm:%{!mcpu=m32c:-Tsim16.ld}}}} \ 54*404b540aSrobert %{!T*:%{!msim*: %{mcpu=m16c:-Tm16c.ld} \ 55*404b540aSrobert %{mcpu=m32cm:-Tm32cm.ld} \ 56*404b540aSrobert %{mcpu=m32c:-Tm32c.ld} \ 57*404b540aSrobert %{!mcpu=m16c:%{!mcpu=m32cm:%{!mcpu=m32c:-Tr8c.ld}}}}} \ 58*404b540aSrobert " 59*404b540aSrobert 60*404b540aSrobert /* Run-time Target Specification */ 61*404b540aSrobert 62*404b540aSrobert /* Nothing unusual here. */ 63*404b540aSrobert #define TARGET_CPU_CPP_BUILTINS() \ 64*404b540aSrobert { \ 65*404b540aSrobert builtin_assert ("cpu=m32c"); \ 66*404b540aSrobert builtin_assert ("machine=m32c"); \ 67*404b540aSrobert builtin_define ("__m32c__=1"); \ 68*404b540aSrobert if (TARGET_R8C) \ 69*404b540aSrobert builtin_define ("__r8c_cpu__=1"); \ 70*404b540aSrobert if (TARGET_M16C) \ 71*404b540aSrobert builtin_define ("__m16c_cpu__=1"); \ 72*404b540aSrobert if (TARGET_M32CM) \ 73*404b540aSrobert builtin_define ("__m32cm_cpu__=1"); \ 74*404b540aSrobert if (TARGET_M32C) \ 75*404b540aSrobert builtin_define ("__m32c_cpu__=1"); \ 76*404b540aSrobert } 77*404b540aSrobert 78*404b540aSrobert /* The pragma handlers need to know if we've started processing 79*404b540aSrobert functions yet, as the memregs pragma should only be given at the 80*404b540aSrobert beginning of the file. This variable starts off TRUE and later 81*404b540aSrobert becomes FALSE. */ 82*404b540aSrobert extern int ok_to_change_target_memregs; 83*404b540aSrobert extern int target_memregs; 84*404b540aSrobert 85*404b540aSrobert /* TARGET_CPU is a multi-way option set in m32c.opt. While we could 86*404b540aSrobert use enums or defines for this, this and m32c.opt are the only 87*404b540aSrobert places that know (or care) what values are being used. */ 88*404b540aSrobert #define TARGET_R8C (target_cpu == 'r') 89*404b540aSrobert #define TARGET_M16C (target_cpu == '6') 90*404b540aSrobert #define TARGET_M32CM (target_cpu == 'm') 91*404b540aSrobert #define TARGET_M32C (target_cpu == '3') 92*404b540aSrobert 93*404b540aSrobert /* Address register sizes. Warning: these are used all over the place 94*404b540aSrobert to select between the two CPU families in general. */ 95*404b540aSrobert #define TARGET_A16 (TARGET_R8C || TARGET_M16C) 96*404b540aSrobert #define TARGET_A24 (TARGET_M32CM || TARGET_M32C) 97*404b540aSrobert 98*404b540aSrobert #define TARGET_VERSION fprintf (stderr, " (m32c)"); 99*404b540aSrobert 100*404b540aSrobert #define OVERRIDE_OPTIONS m32c_override_options (); 101*404b540aSrobert 102*404b540aSrobert /* Defining data structures for per-function information */ 103*404b540aSrobert 104*404b540aSrobert typedef struct machine_function GTY (()) 105*404b540aSrobert { 106*404b540aSrobert /* How much we adjust the stack when returning from an exception 107*404b540aSrobert handler. */ 108*404b540aSrobert rtx eh_stack_adjust; 109*404b540aSrobert 110*404b540aSrobert /* TRUE if the current function is an interrupt handler. */ 111*404b540aSrobert int is_interrupt; 112*404b540aSrobert 113*404b540aSrobert /* TRUE if the current function is a leaf function. Currently, this 114*404b540aSrobert only affects saving $a0 in interrupt functions. */ 115*404b540aSrobert int is_leaf; 116*404b540aSrobert 117*404b540aSrobert /* Bitmask that keeps track of which registers are used in an 118*404b540aSrobert interrupt function, so we know which ones need to be saved and 119*404b540aSrobert restored. */ 120*404b540aSrobert int intr_pushm; 121*404b540aSrobert /* Likewise, one element for each memreg that needs to be saved. */ 122*404b540aSrobert char intr_pushmem[16]; 123*404b540aSrobert 124*404b540aSrobert /* TRUE if the current function can use a simple RTS to return, instead 125*404b540aSrobert of the longer ENTER/EXIT pair. */ 126*404b540aSrobert int use_rts; 127*404b540aSrobert } 128*404b540aSrobert machine_function; 129*404b540aSrobert 130*404b540aSrobert #define INIT_EXPANDERS m32c_init_expanders () 131*404b540aSrobert 132*404b540aSrobert /* Storage Layout */ 133*404b540aSrobert 134*404b540aSrobert #define BITS_BIG_ENDIAN 0 135*404b540aSrobert #define BYTES_BIG_ENDIAN 0 136*404b540aSrobert #define WORDS_BIG_ENDIAN 0 137*404b540aSrobert 138*404b540aSrobert /* We can do QI, HI, and SI operations pretty much equally well, but 139*404b540aSrobert GCC expects us to have a "native" format, so we pick the one that 140*404b540aSrobert matches "int". Pointers are 16 bits for R8C/M16C (when TARGET_A16 141*404b540aSrobert is true) and 24 bits for M32CM/M32C (when TARGET_A24 is true), but 142*404b540aSrobert 24 bit pointers are stored in 32 bit words. */ 143*404b540aSrobert #define BITS_PER_UNIT 8 144*404b540aSrobert #define UNITS_PER_WORD 2 145*404b540aSrobert #define POINTER_SIZE (TARGET_A16 ? 16 : 32) 146*404b540aSrobert #define POINTERS_EXTEND_UNSIGNED 1 147*404b540aSrobert 148*404b540aSrobert /* These match the alignment enforced by the two types of stack operations. */ 149*404b540aSrobert #define PARM_BOUNDARY (TARGET_A16 ? 8 : 16) 150*404b540aSrobert #define STACK_BOUNDARY (TARGET_A16 ? 8 : 16) 151*404b540aSrobert 152*404b540aSrobert /* We do this because we care more about space than about speed. For 153*404b540aSrobert the chips with 16 bit busses, we could set these to 16 if 154*404b540aSrobert desired. */ 155*404b540aSrobert #define FUNCTION_BOUNDARY 8 156*404b540aSrobert #define BIGGEST_ALIGNMENT 8 157*404b540aSrobert 158*404b540aSrobert #define STRICT_ALIGNMENT 0 159*404b540aSrobert #define SLOW_BYTE_ACCESS 1 160*404b540aSrobert 161*404b540aSrobert /* Layout of Source Language Data Types */ 162*404b540aSrobert 163*404b540aSrobert #define INT_TYPE_SIZE 16 164*404b540aSrobert #define SHORT_TYPE_SIZE 16 165*404b540aSrobert #define LONG_TYPE_SIZE 32 166*404b540aSrobert #define LONG_LONG_TYPE_SIZE 64 167*404b540aSrobert 168*404b540aSrobert #define FLOAT_TYPE_SIZE 32 169*404b540aSrobert #define DOUBLE_TYPE_SIZE 64 170*404b540aSrobert #define LONG_DOUBLE_TYPE_SIZE 64 171*404b540aSrobert 172*404b540aSrobert #define DEFAULT_SIGNED_CHAR 1 173*404b540aSrobert 174*404b540aSrobert #undef PTRDIFF_TYPE 175*404b540aSrobert #define PTRDIFF_TYPE (TARGET_A16 ? "int" : "long int") 176*404b540aSrobert 177*404b540aSrobert /* REGISTER USAGE */ 178*404b540aSrobert 179*404b540aSrobert /* Register Basics */ 180*404b540aSrobert 181*404b540aSrobert /* Register layout: 182*404b540aSrobert 183*404b540aSrobert [r0h][r0l] $r0 (16 bits, or two 8 bit halves) 184*404b540aSrobert [--------] $r2 (16 bits) 185*404b540aSrobert [r1h][r1l] $r1 (16 bits, or two 8 bit halves) 186*404b540aSrobert [--------] $r3 (16 bits) 187*404b540aSrobert [---][--------] $a0 (might be 24 bits) 188*404b540aSrobert [---][--------] $a1 (might be 24 bits) 189*404b540aSrobert [---][--------] $sb (might be 24 bits) 190*404b540aSrobert [---][--------] $fb (might be 24 bits) 191*404b540aSrobert [---][--------] $sp (might be 24 bits) 192*404b540aSrobert [-------------] $pc (20 or 24 bits) 193*404b540aSrobert [---] $flg (CPU flags) 194*404b540aSrobert [---][--------] $argp (virtual) 195*404b540aSrobert [--------] $mem0 (all 16 bits) 196*404b540aSrobert . . . 197*404b540aSrobert [--------] $mem14 198*404b540aSrobert */ 199*404b540aSrobert 200*404b540aSrobert #define FIRST_PSEUDO_REGISTER 20 201*404b540aSrobert 202*404b540aSrobert /* Note that these two tables are modified based on which CPU family 203*404b540aSrobert you select; see m32c_conditional_register_usage for details. */ 204*404b540aSrobert 205*404b540aSrobert /* r0 r2 r1 r3 - a0 a1 sb fb - sp pc flg argp - mem0..mem14 */ 206*404b540aSrobert #define FIXED_REGISTERS { 0, 0, 0, 0, \ 207*404b540aSrobert 0, 0, 1, 0, \ 208*404b540aSrobert 1, 1, 0, 1, \ 209*404b540aSrobert 0, 0, 0, 0, 0, 0, 0, 0 } 210*404b540aSrobert #define CALL_USED_REGISTERS { 1, 1, 1, 1, \ 211*404b540aSrobert 1, 1, 1, 0, \ 212*404b540aSrobert 1, 1, 1, 1, \ 213*404b540aSrobert 1, 1, 1, 1, 1, 1, 1, 1 } 214*404b540aSrobert 215*404b540aSrobert #define CONDITIONAL_REGISTER_USAGE m32c_conditional_register_usage (); 216*404b540aSrobert 217*404b540aSrobert /* The *_REGNO theme matches m32c.md and most register number 218*404b540aSrobert arguments; the PC_REGNUM is the odd one out. */ 219*404b540aSrobert #ifndef PC_REGNO 220*404b540aSrobert #define PC_REGNO 9 221*404b540aSrobert #endif 222*404b540aSrobert #define PC_REGNUM PC_REGNO 223*404b540aSrobert 224*404b540aSrobert /* Order of Allocation of Registers */ 225*404b540aSrobert 226*404b540aSrobert #define REG_ALLOC_ORDER { \ 227*404b540aSrobert 0, 1, 2, 3, 4, 5, /* r0..r3, a0, a1 */ \ 228*404b540aSrobert 12, 13, 14, 15, 16, 17, 18, /* mem0..mem7 */ \ 229*404b540aSrobert 6, 7, 8, 9, 10, 11 /* sb, fb, sp, pc, flg, ap */ } 230*404b540aSrobert 231*404b540aSrobert /* How Values Fit in Registers */ 232*404b540aSrobert 233*404b540aSrobert #define HARD_REGNO_NREGS(R,M) m32c_hard_regno_nregs (R, M) 234*404b540aSrobert #define HARD_REGNO_MODE_OK(R,M) m32c_hard_regno_ok (R, M) 235*404b540aSrobert #define MODES_TIEABLE_P(M1,M2) m32c_modes_tieable_p (M1, M2) 236*404b540aSrobert #define AVOID_CCMODE_COPIES 237*404b540aSrobert 238*404b540aSrobert /* Register Classes */ 239*404b540aSrobert 240*404b540aSrobert /* Most registers are special purpose in some form or another, so this 241*404b540aSrobert table is pretty big. Class names are used for constraints also; 242*404b540aSrobert for example the HL_REGS class (HL below) is "Rhl" in the md files. 243*404b540aSrobert See m32c_reg_class_from_constraint for the mapping. There's some 244*404b540aSrobert duplication so that we can better isolate the reason for using 245*404b540aSrobert constraints in the md files from the actual registers used; for 246*404b540aSrobert example we may want to exclude a1a0 from SI_REGS in the future, 247*404b540aSrobert without precluding their use as HImode registers. */ 248*404b540aSrobert 249*404b540aSrobert /* m7654 - m3210 - argp flg pc sp - fb sb a1 a0 - r3 r1 r2 r0 */ 250*404b540aSrobert /* mmPAR */ 251*404b540aSrobert #define REG_CLASS_CONTENTS \ 252*404b540aSrobert { { 0x00000000 }, /* NO */\ 253*404b540aSrobert { 0x00000100 }, /* SP - sp */\ 254*404b540aSrobert { 0x00000080 }, /* FB - fb */\ 255*404b540aSrobert { 0x00000040 }, /* SB - sb */\ 256*404b540aSrobert { 0x000001c0 }, /* CR - sb fb sp */\ 257*404b540aSrobert { 0x00000001 }, /* R0 - r0 */\ 258*404b540aSrobert { 0x00000004 }, /* R1 - r1 */\ 259*404b540aSrobert { 0x00000002 }, /* R2 - r2 */\ 260*404b540aSrobert { 0x00000008 }, /* R3 - r3 */\ 261*404b540aSrobert { 0x00000003 }, /* R02 - r0r2 */\ 262*404b540aSrobert { 0x00000005 }, /* HL - r0 r1 */\ 263*404b540aSrobert { 0x00000005 }, /* QI - r0 r1 */\ 264*404b540aSrobert { 0x0000000a }, /* R23 - r2 r3 */\ 265*404b540aSrobert { 0x0000000f }, /* R03 - r0r2 r1r3 */\ 266*404b540aSrobert { 0x0000000f }, /* DI - r0r2r1r3 + mems */\ 267*404b540aSrobert { 0x00000010 }, /* A0 - a0 */\ 268*404b540aSrobert { 0x00000020 }, /* A1 - a1 */\ 269*404b540aSrobert { 0x00000030 }, /* A - a0 a1 */\ 270*404b540aSrobert { 0x000000f0 }, /* AD - a0 a1 sb fp */\ 271*404b540aSrobert { 0x000001f0 }, /* PS - a0 a1 sb fp sp */\ 272*404b540aSrobert { 0x0000000f }, /* SI - r0r2 r1r3 a0a1 */\ 273*404b540aSrobert { 0x0000003f }, /* HI - r0 r1 r2 r3 a0 a1 */\ 274*404b540aSrobert { 0x0000003f }, /* RA - r0..r3 a0 a1 */\ 275*404b540aSrobert { 0x0000007f }, /* GENERAL */\ 276*404b540aSrobert { 0x00000400 }, /* FLG */\ 277*404b540aSrobert { 0x000001ff }, /* HC - r0l r1 r2 r3 a0 a1 sb fb sp */\ 278*404b540aSrobert { 0x000ff000 }, /* MEM */\ 279*404b540aSrobert { 0x000ff003 }, /* R02_A_MEM */\ 280*404b540aSrobert { 0x000ff005 }, /* A_HL_MEM */\ 281*404b540aSrobert { 0x000ff00c }, /* R1_R3_A_MEM */\ 282*404b540aSrobert { 0x000ff00f }, /* R03_MEM */\ 283*404b540aSrobert { 0x000ff03f }, /* A_HI_MEM */\ 284*404b540aSrobert { 0x000ff0ff }, /* A_AD_CR_MEM_SI */\ 285*404b540aSrobert { 0x000ff1ff }, /* ALL */\ 286*404b540aSrobert } 287*404b540aSrobert 288*404b540aSrobert enum reg_class 289*404b540aSrobert { 290*404b540aSrobert NO_REGS, 291*404b540aSrobert SP_REGS, 292*404b540aSrobert FB_REGS, 293*404b540aSrobert SB_REGS, 294*404b540aSrobert CR_REGS, 295*404b540aSrobert R0_REGS, 296*404b540aSrobert R1_REGS, 297*404b540aSrobert R2_REGS, 298*404b540aSrobert R3_REGS, 299*404b540aSrobert R02_REGS, 300*404b540aSrobert HL_REGS, 301*404b540aSrobert QI_REGS, 302*404b540aSrobert R23_REGS, 303*404b540aSrobert R03_REGS, 304*404b540aSrobert DI_REGS, 305*404b540aSrobert A0_REGS, 306*404b540aSrobert A1_REGS, 307*404b540aSrobert A_REGS, 308*404b540aSrobert AD_REGS, 309*404b540aSrobert PS_REGS, 310*404b540aSrobert SI_REGS, 311*404b540aSrobert HI_REGS, 312*404b540aSrobert RA_REGS, 313*404b540aSrobert GENERAL_REGS, 314*404b540aSrobert FLG_REGS, 315*404b540aSrobert HC_REGS, 316*404b540aSrobert MEM_REGS, 317*404b540aSrobert R02_A_MEM_REGS, 318*404b540aSrobert A_HL_MEM_REGS, 319*404b540aSrobert R1_R3_A_MEM_REGS, 320*404b540aSrobert R03_MEM_REGS, 321*404b540aSrobert A_HI_MEM_REGS, 322*404b540aSrobert A_AD_CR_MEM_SI_REGS, 323*404b540aSrobert ALL_REGS, 324*404b540aSrobert LIM_REG_CLASSES 325*404b540aSrobert }; 326*404b540aSrobert 327*404b540aSrobert #define N_REG_CLASSES LIM_REG_CLASSES 328*404b540aSrobert 329*404b540aSrobert #define REG_CLASS_NAMES {\ 330*404b540aSrobert "NO_REGS", \ 331*404b540aSrobert "SP_REGS", \ 332*404b540aSrobert "FB_REGS", \ 333*404b540aSrobert "SB_REGS", \ 334*404b540aSrobert "CR_REGS", \ 335*404b540aSrobert "R0_REGS", \ 336*404b540aSrobert "R1_REGS", \ 337*404b540aSrobert "R2_REGS", \ 338*404b540aSrobert "R3_REGS", \ 339*404b540aSrobert "R02_REGS", \ 340*404b540aSrobert "HL_REGS", \ 341*404b540aSrobert "QI_REGS", \ 342*404b540aSrobert "R23_REGS", \ 343*404b540aSrobert "R03_REGS", \ 344*404b540aSrobert "DI_REGS", \ 345*404b540aSrobert "A0_REGS", \ 346*404b540aSrobert "A1_REGS", \ 347*404b540aSrobert "A_REGS", \ 348*404b540aSrobert "AD_REGS", \ 349*404b540aSrobert "PS_REGS", \ 350*404b540aSrobert "SI_REGS", \ 351*404b540aSrobert "HI_REGS", \ 352*404b540aSrobert "RA_REGS", \ 353*404b540aSrobert "GENERAL_REGS", \ 354*404b540aSrobert "FLG_REGS", \ 355*404b540aSrobert "HC_REGS", \ 356*404b540aSrobert "MEM_REGS", \ 357*404b540aSrobert "R02_A_MEM_REGS", \ 358*404b540aSrobert "A_HL_MEM_REGS", \ 359*404b540aSrobert "R1_R3_A_MEM_REGS", \ 360*404b540aSrobert "R03_MEM_REGS", \ 361*404b540aSrobert "A_HI_MEM_REGS", \ 362*404b540aSrobert "A_AD_CR_MEM_SI_REGS", \ 363*404b540aSrobert "ALL_REGS", \ 364*404b540aSrobert } 365*404b540aSrobert 366*404b540aSrobert #define REGNO_REG_CLASS(R) m32c_regno_reg_class (R) 367*404b540aSrobert 368*404b540aSrobert /* We support simple displacements off address registers, nothing else. */ 369*404b540aSrobert #define BASE_REG_CLASS A_REGS 370*404b540aSrobert #define INDEX_REG_CLASS NO_REGS 371*404b540aSrobert 372*404b540aSrobert /* We primarily use the new "long" constraint names, with the initial 373*404b540aSrobert letter classifying the constraint type and following letters 374*404b540aSrobert specifying which. The types are: 375*404b540aSrobert 376*404b540aSrobert I - integer values 377*404b540aSrobert R - register classes 378*404b540aSrobert S - memory references (M was used) 379*404b540aSrobert A - addresses (currently unused) 380*404b540aSrobert */ 381*404b540aSrobert 382*404b540aSrobert #define CONSTRAINT_LEN(CHAR,STR) \ 383*404b540aSrobert ((CHAR) == 'I' ? 3 \ 384*404b540aSrobert : (CHAR) == 'R' ? 3 \ 385*404b540aSrobert : (CHAR) == 'S' ? 2 \ 386*404b540aSrobert : (CHAR) == 'A' ? 2 \ 387*404b540aSrobert : DEFAULT_CONSTRAINT_LEN(CHAR,STR)) 388*404b540aSrobert #define REG_CLASS_FROM_CONSTRAINT(CHAR,STR) \ 389*404b540aSrobert m32c_reg_class_from_constraint (CHAR, STR) 390*404b540aSrobert 391*404b540aSrobert #define REGNO_OK_FOR_BASE_P(NUM) m32c_regno_ok_for_base_p (NUM) 392*404b540aSrobert #define REGNO_OK_FOR_INDEX_P(NUM) 0 393*404b540aSrobert 394*404b540aSrobert #define PREFERRED_RELOAD_CLASS(X,CLASS) m32c_preferred_reload_class (X, CLASS) 395*404b540aSrobert #define PREFERRED_OUTPUT_RELOAD_CLASS(X,CLASS) m32c_preferred_output_reload_class (X, CLASS) 396*404b540aSrobert #define LIMIT_RELOAD_CLASS(MODE,CLASS) m32c_limit_reload_class (MODE, CLASS) 397*404b540aSrobert 398*404b540aSrobert #define SECONDARY_RELOAD_CLASS(CLASS,MODE,X) m32c_secondary_reload_class (CLASS, MODE, X) 399*404b540aSrobert 400*404b540aSrobert #define SMALL_REGISTER_CLASSES 1 401*404b540aSrobert 402*404b540aSrobert #define CLASS_LIKELY_SPILLED_P(C) m32c_class_likely_spilled_p (C) 403*404b540aSrobert 404*404b540aSrobert #define CLASS_MAX_NREGS(C,M) m32c_class_max_nregs (C, M) 405*404b540aSrobert 406*404b540aSrobert #define CANNOT_CHANGE_MODE_CLASS(F,T,C) m32c_cannot_change_mode_class(F,T,C) 407*404b540aSrobert 408*404b540aSrobert #define CONST_OK_FOR_CONSTRAINT_P(VALUE,C,STR) \ 409*404b540aSrobert m32c_const_ok_for_constraint_p (VALUE, C, STR) 410*404b540aSrobert #define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(VALUE,C,STR) 0 411*404b540aSrobert #define EXTRA_CONSTRAINT_STR(VALUE,C,STR) \ 412*404b540aSrobert m32c_extra_constraint_p (VALUE, C, STR) 413*404b540aSrobert #define EXTRA_MEMORY_CONSTRAINT(C,STR) \ 414*404b540aSrobert m32c_extra_memory_constraint (C, STR) 415*404b540aSrobert #define EXTRA_ADDRESS_CONSTRAINT(C,STR) \ 416*404b540aSrobert m32c_extra_address_constraint (C, STR) 417*404b540aSrobert 418*404b540aSrobert /* STACK AND CALLING */ 419*404b540aSrobert 420*404b540aSrobert /* Frame Layout */ 421*404b540aSrobert 422*404b540aSrobert /* Standard push/pop stack, no surprises here. */ 423*404b540aSrobert 424*404b540aSrobert #define STACK_GROWS_DOWNWARD 1 425*404b540aSrobert #define STACK_PUSH_CODE PRE_DEC 426*404b540aSrobert #define FRAME_GROWS_DOWNWARD 1 427*404b540aSrobert 428*404b540aSrobert #define STARTING_FRAME_OFFSET 0 429*404b540aSrobert #define FIRST_PARM_OFFSET(F) 0 430*404b540aSrobert 431*404b540aSrobert #define RETURN_ADDR_RTX(COUNT,FA) m32c_return_addr_rtx (COUNT) 432*404b540aSrobert 433*404b540aSrobert #define INCOMING_RETURN_ADDR_RTX m32c_incoming_return_addr_rtx() 434*404b540aSrobert #define INCOMING_FRAME_SP_OFFSET (TARGET_A24 ? 4 : 3) 435*404b540aSrobert 436*404b540aSrobert /* Exception Handling Support */ 437*404b540aSrobert 438*404b540aSrobert #define EH_RETURN_DATA_REGNO(N) m32c_eh_return_data_regno (N) 439*404b540aSrobert #define EH_RETURN_STACKADJ_RTX m32c_eh_return_stackadj_rtx () 440*404b540aSrobert 441*404b540aSrobert /* Registers That Address the Stack Frame */ 442*404b540aSrobert 443*404b540aSrobert #ifndef FP_REGNO 444*404b540aSrobert #define FP_REGNO 7 445*404b540aSrobert #endif 446*404b540aSrobert #ifndef SP_REGNO 447*404b540aSrobert #define SP_REGNO 8 448*404b540aSrobert #endif 449*404b540aSrobert #define AP_REGNO 11 450*404b540aSrobert 451*404b540aSrobert #define STACK_POINTER_REGNUM SP_REGNO 452*404b540aSrobert #define FRAME_POINTER_REGNUM FP_REGNO 453*404b540aSrobert #define ARG_POINTER_REGNUM AP_REGNO 454*404b540aSrobert 455*404b540aSrobert /* The static chain must be pointer-capable. */ 456*404b540aSrobert #define STATIC_CHAIN_REGNUM A0_REGNO 457*404b540aSrobert 458*404b540aSrobert #define DWARF_FRAME_REGISTERS 20 459*404b540aSrobert #define DWARF_FRAME_REGNUM(N) m32c_dwarf_frame_regnum (N) 460*404b540aSrobert #define DBX_REGISTER_NUMBER(N) m32c_dwarf_frame_regnum (N) 461*404b540aSrobert 462*404b540aSrobert /* Eliminating Frame Pointer and Arg Pointer */ 463*404b540aSrobert 464*404b540aSrobert /* If the frame pointer isn't used, we detect it manually. But the 465*404b540aSrobert stack pointer doesn't have as flexible addressing as the frame 466*404b540aSrobert pointer, so we always assume we have it. */ 467*404b540aSrobert #define FRAME_POINTER_REQUIRED 1 468*404b540aSrobert 469*404b540aSrobert #define ELIMINABLE_REGS \ 470*404b540aSrobert {{AP_REGNO, SP_REGNO}, \ 471*404b540aSrobert {AP_REGNO, FB_REGNO}, \ 472*404b540aSrobert {FB_REGNO, SP_REGNO}} 473*404b540aSrobert 474*404b540aSrobert #define CAN_ELIMINATE(FROM,TO) 1 475*404b540aSrobert #define INITIAL_ELIMINATION_OFFSET(FROM,TO,VAR) \ 476*404b540aSrobert (VAR) = m32c_initial_elimination_offset(FROM,TO) 477*404b540aSrobert 478*404b540aSrobert /* Passing Function Arguments on the Stack */ 479*404b540aSrobert 480*404b540aSrobert #define PUSH_ARGS 1 481*404b540aSrobert #define PUSH_ROUNDING(N) m32c_push_rounding (N) 482*404b540aSrobert #define RETURN_POPS_ARGS(D,T,S) 0 483*404b540aSrobert #define CALL_POPS_ARGS(C) 0 484*404b540aSrobert 485*404b540aSrobert /* Passing Arguments in Registers */ 486*404b540aSrobert 487*404b540aSrobert #define FUNCTION_ARG(CA,MODE,TYPE,NAMED) \ 488*404b540aSrobert m32c_function_arg (&(CA),MODE,TYPE,NAMED) 489*404b540aSrobert 490*404b540aSrobert typedef struct m32c_cumulative_args 491*404b540aSrobert { 492*404b540aSrobert /* For address of return value buffer (structures are returned by 493*404b540aSrobert passing the address of a buffer as an invisible first argument. 494*404b540aSrobert This identifies it). If set, the current parameter will be put 495*404b540aSrobert on the stack, regardless of type. */ 496*404b540aSrobert int force_mem; 497*404b540aSrobert /* First parm is 1, parm 0 is hidden pointer for returning 498*404b540aSrobert aggregates. */ 499*404b540aSrobert int parm_num; 500*404b540aSrobert } m32c_cumulative_args; 501*404b540aSrobert 502*404b540aSrobert #define CUMULATIVE_ARGS m32c_cumulative_args 503*404b540aSrobert #define INIT_CUMULATIVE_ARGS(CA,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \ 504*404b540aSrobert m32c_init_cumulative_args (&(CA),FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) 505*404b540aSrobert #define FUNCTION_ARG_ADVANCE(CA,MODE,TYPE,NAMED) \ 506*404b540aSrobert m32c_function_arg_advance (&(CA),MODE,TYPE,NAMED) 507*404b540aSrobert #define FUNCTION_ARG_BOUNDARY(MODE,TYPE) (TARGET_A16 ? 8 : 16) 508*404b540aSrobert #define FUNCTION_ARG_REGNO_P(r) m32c_function_arg_regno_p (r) 509*404b540aSrobert 510*404b540aSrobert /* How Scalar Function Values Are Returned */ 511*404b540aSrobert 512*404b540aSrobert #define FUNCTION_VALUE(VT,F) m32c_function_value (VT, F) 513*404b540aSrobert #define LIBCALL_VALUE(MODE) m32c_libcall_value (MODE) 514*404b540aSrobert 515*404b540aSrobert #define FUNCTION_VALUE_REGNO_P(r) ((r) == R0_REGNO || (r) == MEM0_REGNO) 516*404b540aSrobert 517*404b540aSrobert /* How Large Values Are Returned */ 518*404b540aSrobert 519*404b540aSrobert #define DEFAULT_PCC_STRUCT_RETURN 1 520*404b540aSrobert 521*404b540aSrobert /* Function Entry and Exit */ 522*404b540aSrobert 523*404b540aSrobert #define EXIT_IGNORE_STACK 0 524*404b540aSrobert #define EPILOGUE_USES(REGNO) m32c_epilogue_uses(REGNO) 525*404b540aSrobert #define EH_USES(REGNO) 0 /* FIXME */ 526*404b540aSrobert 527*404b540aSrobert /* Generating Code for Profiling */ 528*404b540aSrobert 529*404b540aSrobert #define FUNCTION_PROFILER(FILE,LABELNO) 530*404b540aSrobert 531*404b540aSrobert /* Implementing the Varargs Macros */ 532*404b540aSrobert 533*404b540aSrobert /* Trampolines for Nested Functions */ 534*404b540aSrobert 535*404b540aSrobert #define TRAMPOLINE_SIZE m32c_trampoline_size () 536*404b540aSrobert #define TRAMPOLINE_ALIGNMENT m32c_trampoline_alignment () 537*404b540aSrobert #define INITIALIZE_TRAMPOLINE(a,fn,sc) m32c_initialize_trampoline (a, fn, sc) 538*404b540aSrobert 539*404b540aSrobert /* Addressing Modes */ 540*404b540aSrobert 541*404b540aSrobert #define HAVE_PRE_DECREMENT 1 542*404b540aSrobert #define HAVE_POST_INCREMENT 1 543*404b540aSrobert #define CONSTANT_ADDRESS_P(X) CONSTANT_P(X) 544*404b540aSrobert #define MAX_REGS_PER_ADDRESS 1 545*404b540aSrobert 546*404b540aSrobert /* This is passed to the macros below, so that they can be implemented 547*404b540aSrobert in m32c.c. */ 548*404b540aSrobert #ifdef REG_OK_STRICT 549*404b540aSrobert #define REG_OK_STRICT_V 1 550*404b540aSrobert #else 551*404b540aSrobert #define REG_OK_STRICT_V 0 552*404b540aSrobert #endif 553*404b540aSrobert 554*404b540aSrobert #define GO_IF_LEGITIMATE_ADDRESS(MODE,X,LABEL) \ 555*404b540aSrobert if (m32c_legitimate_address_p (MODE, X, REG_OK_STRICT_V)) \ 556*404b540aSrobert goto LABEL; 557*404b540aSrobert 558*404b540aSrobert #define REG_OK_FOR_BASE_P(X) m32c_reg_ok_for_base_p (X, REG_OK_STRICT_V) 559*404b540aSrobert #define REG_OK_FOR_INDEX_P(X) 0 560*404b540aSrobert 561*404b540aSrobert /* #define FIND_BASE_TERM(X) when we do unspecs for symrefs */ 562*404b540aSrobert 563*404b540aSrobert #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \ 564*404b540aSrobert if (m32c_legitimize_address(&(X),OLDX,MODE)) \ 565*404b540aSrobert goto win; 566*404b540aSrobert 567*404b540aSrobert #define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \ 568*404b540aSrobert if (m32c_legitimize_reload_address(&(X),MODE,OPNUM,TYPE,IND_LEVELS)) \ 569*404b540aSrobert goto win; 570*404b540aSrobert 571*404b540aSrobert #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \ 572*404b540aSrobert if (m32c_mode_dependent_address (ADDR)) \ 573*404b540aSrobert goto LABEL; 574*404b540aSrobert 575*404b540aSrobert #define LEGITIMATE_CONSTANT_P(X) m32c_legitimate_constant_p (X) 576*404b540aSrobert 577*404b540aSrobert /* Condition Code Status */ 578*404b540aSrobert 579*404b540aSrobert #define REVERSIBLE_CC_MODE(MODE) 1 580*404b540aSrobert 581*404b540aSrobert /* Describing Relative Costs of Operations */ 582*404b540aSrobert 583*404b540aSrobert #define REGISTER_MOVE_COST(MODE,FROM,TO) \ 584*404b540aSrobert m32c_register_move_cost (MODE, FROM, TO) 585*404b540aSrobert #define MEMORY_MOVE_COST(MODE,CLASS,IN) \ 586*404b540aSrobert m32c_memory_move_cost (MODE, CLASS, IN) 587*404b540aSrobert 588*404b540aSrobert /* Dividing the Output into Sections (Texts, Data, ...) */ 589*404b540aSrobert 590*404b540aSrobert #define TEXT_SECTION_ASM_OP ".text" 591*404b540aSrobert #define DATA_SECTION_ASM_OP ".data" 592*404b540aSrobert #define BSS_SECTION_ASM_OP ".bss" 593*404b540aSrobert 594*404b540aSrobert #define CTOR_LIST_BEGIN 595*404b540aSrobert #define CTOR_LIST_END 596*404b540aSrobert #define DTOR_LIST_BEGIN 597*404b540aSrobert #define DTOR_LIST_END 598*404b540aSrobert #define CTORS_SECTION_ASM_OP "\t.section\t.init_array,\"aw\",%init_array" 599*404b540aSrobert #define DTORS_SECTION_ASM_OP "\t.section\t.fini_array,\"aw\",%fini_array" 600*404b540aSrobert #define INIT_ARRAY_SECTION_ASM_OP "\t.section\t.init_array,\"aw\",%init_array" 601*404b540aSrobert #define FINI_ARRAY_SECTION_ASM_OP "\t.section\t.fini_array,\"aw\",%fini_array" 602*404b540aSrobert 603*404b540aSrobert /* The Overall Framework of an Assembler File */ 604*404b540aSrobert 605*404b540aSrobert #define ASM_COMMENT_START ";" 606*404b540aSrobert #define ASM_APP_ON "" 607*404b540aSrobert #define ASM_APP_OFF "" 608*404b540aSrobert 609*404b540aSrobert /* Output and Generation of Labels */ 610*404b540aSrobert 611*404b540aSrobert #define GLOBAL_ASM_OP "\t.global\t" 612*404b540aSrobert 613*404b540aSrobert /* Output of Assembler Instructions */ 614*404b540aSrobert 615*404b540aSrobert #define REGISTER_NAMES { \ 616*404b540aSrobert "r0", "r2", "r1", "r3", \ 617*404b540aSrobert "a0", "a1", "sb", "fb", "sp", \ 618*404b540aSrobert "pc", "flg", "argp", \ 619*404b540aSrobert "mem0", "mem2", "mem4", "mem6", "mem8", "mem10", "mem12", "mem14", \ 620*404b540aSrobert } 621*404b540aSrobert 622*404b540aSrobert #define ADDITIONAL_REGISTER_NAMES { \ 623*404b540aSrobert {"r0l", 0}, \ 624*404b540aSrobert {"r1l", 2}, \ 625*404b540aSrobert {"r0r2", 0}, \ 626*404b540aSrobert {"r1r3", 2}, \ 627*404b540aSrobert {"a0a1", 4}, \ 628*404b540aSrobert {"r0r2r1r3", 0} } 629*404b540aSrobert 630*404b540aSrobert #define PRINT_OPERAND(S,X,C) m32c_print_operand (S, X, C) 631*404b540aSrobert #define PRINT_OPERAND_PUNCT_VALID_P(C) m32c_print_operand_punct_valid_p (C) 632*404b540aSrobert #define PRINT_OPERAND_ADDRESS(S,X) m32c_print_operand_address (S, X) 633*404b540aSrobert 634*404b540aSrobert #undef USER_LABEL_PREFIX 635*404b540aSrobert #define USER_LABEL_PREFIX "_" 636*404b540aSrobert 637*404b540aSrobert #define ASM_OUTPUT_REG_PUSH(S,R) m32c_output_reg_push (S, R) 638*404b540aSrobert #define ASM_OUTPUT_REG_POP(S,R) m32c_output_reg_pop (S, R) 639*404b540aSrobert 640*404b540aSrobert /* Output of Dispatch Tables */ 641*404b540aSrobert 642*404b540aSrobert #define ASM_OUTPUT_ADDR_VEC_ELT(S,V) \ 643*404b540aSrobert fprintf (S, "\t.word L%d\n", V) 644*404b540aSrobert 645*404b540aSrobert /* Assembler Commands for Exception Regions */ 646*404b540aSrobert 647*404b540aSrobert #define DWARF_CIE_DATA_ALIGNMENT -1 648*404b540aSrobert 649*404b540aSrobert /* Assembler Commands for Alignment */ 650*404b540aSrobert 651*404b540aSrobert #define ASM_OUTPUT_ALIGN(STREAM,POWER) \ 652*404b540aSrobert fprintf (STREAM, "\t.p2align\t%d\n", POWER); 653*404b540aSrobert 654*404b540aSrobert /* Controlling Debugging Information Format */ 655*404b540aSrobert 656*404b540aSrobert #define DWARF2_ADDR_SIZE 4 657*404b540aSrobert 658*404b540aSrobert /* Miscellaneous Parameters */ 659*404b540aSrobert 660*404b540aSrobert #define HAS_LONG_COND_BRANCH false 661*404b540aSrobert #define HAS_LONG_UNCOND_BRANCH true 662*404b540aSrobert #define CASE_VECTOR_MODE SImode 663*404b540aSrobert #define LOAD_EXTEND_OP(MEM) ZERO_EXTEND 664*404b540aSrobert 665*404b540aSrobert #define MOVE_MAX 4 666*404b540aSrobert #define TRULY_NOOP_TRUNCATION(op,ip) 1 667*404b540aSrobert 668*404b540aSrobert #define STORE_FLAG_VALUE 1 669*404b540aSrobert 670*404b540aSrobert /* 16 or 24 bit pointers */ 671*404b540aSrobert #define Pmode (TARGET_A16 ? HImode : PSImode) 672*404b540aSrobert #define FUNCTION_MODE QImode 673*404b540aSrobert 674*404b540aSrobert #define REGISTER_TARGET_PRAGMAS() m32c_register_pragmas() 675*404b540aSrobert 676*404b540aSrobert #endif 677