136ac495dSmrg /* Target Definitions for R8C/M16C/M32C 2*8feb0f0bSmrg Copyright (C) 2005-2020 Free Software Foundation, Inc. 336ac495dSmrg Contributed by Red Hat. 436ac495dSmrg 536ac495dSmrg This file is part of GCC. 636ac495dSmrg 736ac495dSmrg GCC is free software; you can redistribute it and/or modify it 836ac495dSmrg under the terms of the GNU General Public License as published 936ac495dSmrg by the Free Software Foundation; either version 3, or (at your 1036ac495dSmrg option) any later version. 1136ac495dSmrg 1236ac495dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT 1336ac495dSmrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 1436ac495dSmrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 1536ac495dSmrg License for more details. 1636ac495dSmrg 1736ac495dSmrg You should have received a copy of the GNU General Public License 1836ac495dSmrg along with GCC; see the file COPYING3. If not see 1936ac495dSmrg <http://www.gnu.org/licenses/>. */ 2036ac495dSmrg 2136ac495dSmrg #ifndef GCC_M32C_H 2236ac495dSmrg #define GCC_M32C_H 2336ac495dSmrg 2436ac495dSmrg /* Controlling the Compilation Driver, `gcc'. */ 2536ac495dSmrg 2636ac495dSmrg #undef STARTFILE_SPEC 2736ac495dSmrg #define STARTFILE_SPEC "crt0.o%s crtbegin.o%s" 2836ac495dSmrg 2936ac495dSmrg #undef ENDFILE_SPEC 3036ac495dSmrg #define ENDFILE_SPEC "crtend.o%s crtn.o%s" 3136ac495dSmrg 3236ac495dSmrg #undef LINK_SPEC 3336ac495dSmrg #define LINK_SPEC "%{h*} %{v:-V} \ 3436ac495dSmrg %{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic}" 3536ac495dSmrg 3636ac495dSmrg /* There are four CPU series we support, but they basically break down 3736ac495dSmrg into two families - the R8C/M16C families, with 16-bit address 3836ac495dSmrg registers and one set of opcodes, and the M32CM/M32C group, with 3936ac495dSmrg 24-bit address registers and a different set of opcodes. The 4036ac495dSmrg assembler doesn't care except for which opcode set is needed; the 4136ac495dSmrg big difference is in the memory maps, which we cover in 4236ac495dSmrg LIB_SPEC. */ 4336ac495dSmrg 4436ac495dSmrg #undef ASM_SPEC 4536ac495dSmrg #define ASM_SPEC "\ 4636ac495dSmrg %{mcpu=r8c:--m16c} \ 4736ac495dSmrg %{mcpu=m16c:--m16c} \ 4836ac495dSmrg %{mcpu=m32cm:--m32c} \ 4936ac495dSmrg %{mcpu=m32c:--m32c} " 5036ac495dSmrg 5136ac495dSmrg /* The default is R8C hardware. We support a simulator, which has its 5236ac495dSmrg own libgloss and link map, plus one default link map for each chip 5336ac495dSmrg family. Most of the logic here is making sure we do the right 5436ac495dSmrg thing when no CPU is specified, which defaults to R8C. */ 5536ac495dSmrg #undef LIB_SPEC 5636ac495dSmrg #define LIB_SPEC "-( -lc %{msim:-lsim}%{!msim:-lnosys} -) \ 5736ac495dSmrg %{msim:%{!T*: %{mcpu=m32cm:%Tsim24.ld}%{mcpu=m32c:%Tsim24.ld} \ 5836ac495dSmrg %{!mcpu=m32cm:%{!mcpu=m32c:%Tsim16.ld}}}} \ 5936ac495dSmrg %{!T*:%{!msim: %{mcpu=m16c:%Tm16c.ld} \ 6036ac495dSmrg %{mcpu=m32cm:%Tm32cm.ld} \ 6136ac495dSmrg %{mcpu=m32c:%Tm32c.ld} \ 6236ac495dSmrg %{!mcpu=m16c:%{!mcpu=m32cm:%{!mcpu=m32c:%Tr8c.ld}}}}} \ 6336ac495dSmrg " 6436ac495dSmrg 6536ac495dSmrg /* Run-time Target Specification */ 6636ac495dSmrg 6736ac495dSmrg /* Nothing unusual here. */ 6836ac495dSmrg #define TARGET_CPU_CPP_BUILTINS() \ 6936ac495dSmrg { \ 7036ac495dSmrg builtin_assert ("cpu=m32c"); \ 7136ac495dSmrg builtin_assert ("machine=m32c"); \ 7236ac495dSmrg builtin_define ("__m32c__=1"); \ 7336ac495dSmrg if (TARGET_R8C) \ 7436ac495dSmrg builtin_define ("__r8c_cpu__=1"); \ 7536ac495dSmrg if (TARGET_M16C) \ 7636ac495dSmrg builtin_define ("__m16c_cpu__=1"); \ 7736ac495dSmrg if (TARGET_M32CM) \ 7836ac495dSmrg builtin_define ("__m32cm_cpu__=1"); \ 7936ac495dSmrg if (TARGET_M32C) \ 8036ac495dSmrg builtin_define ("__m32c_cpu__=1"); \ 8136ac495dSmrg } 8236ac495dSmrg 8336ac495dSmrg /* The pragma handlers need to know if we've started processing 8436ac495dSmrg functions yet, as the memregs pragma should only be given at the 8536ac495dSmrg beginning of the file. This variable starts off TRUE and later 8636ac495dSmrg becomes FALSE. */ 8736ac495dSmrg extern int ok_to_change_target_memregs; 8836ac495dSmrg 8936ac495dSmrg /* TARGET_CPU is a multi-way option set in m32c.opt. While we could 9036ac495dSmrg use enums or defines for this, this and m32c.opt are the only 9136ac495dSmrg places that know (or care) what values are being used. */ 9236ac495dSmrg #define TARGET_R8C (target_cpu == 'r') 9336ac495dSmrg #define TARGET_M16C (target_cpu == '6') 9436ac495dSmrg #define TARGET_M32CM (target_cpu == 'm') 9536ac495dSmrg #define TARGET_M32C (target_cpu == '3') 9636ac495dSmrg 9736ac495dSmrg /* Address register sizes. Warning: these are used all over the place 9836ac495dSmrg to select between the two CPU families in general. */ 9936ac495dSmrg #define TARGET_A16 (TARGET_R8C || TARGET_M16C) 10036ac495dSmrg #define TARGET_A24 (TARGET_M32CM || TARGET_M32C) 10136ac495dSmrg 10236ac495dSmrg /* Defining data structures for per-function information */ 10336ac495dSmrg 10436ac495dSmrg typedef struct GTY (()) machine_function 10536ac495dSmrg { 10636ac495dSmrg /* How much we adjust the stack when returning from an exception 10736ac495dSmrg handler. */ 10836ac495dSmrg rtx eh_stack_adjust; 10936ac495dSmrg 11036ac495dSmrg /* TRUE if the current function is an interrupt handler. */ 11136ac495dSmrg int is_interrupt; 11236ac495dSmrg 11336ac495dSmrg /* TRUE if the current function is a leaf function. Currently, this 11436ac495dSmrg only affects saving $a0 in interrupt functions. */ 11536ac495dSmrg int is_leaf; 11636ac495dSmrg 11736ac495dSmrg /* Bitmask that keeps track of which registers are used in an 11836ac495dSmrg interrupt function, so we know which ones need to be saved and 11936ac495dSmrg restored. */ 12036ac495dSmrg int intr_pushm; 12136ac495dSmrg /* Likewise, one element for each memreg that needs to be saved. */ 12236ac495dSmrg char intr_pushmem[16]; 12336ac495dSmrg 12436ac495dSmrg /* TRUE if the current function can use a simple RTS to return, instead 12536ac495dSmrg of the longer ENTER/EXIT pair. */ 12636ac495dSmrg int use_rts; 12736ac495dSmrg } 12836ac495dSmrg machine_function; 12936ac495dSmrg 13036ac495dSmrg #define INIT_EXPANDERS m32c_init_expanders () 13136ac495dSmrg 13236ac495dSmrg /* Storage Layout */ 13336ac495dSmrg 13436ac495dSmrg #define BITS_BIG_ENDIAN 0 13536ac495dSmrg #define BYTES_BIG_ENDIAN 0 13636ac495dSmrg #define WORDS_BIG_ENDIAN 0 13736ac495dSmrg 13836ac495dSmrg /* We can do QI, HI, and SI operations pretty much equally well, but 13936ac495dSmrg GCC expects us to have a "native" format, so we pick the one that 14036ac495dSmrg matches "int". Pointers are 16 bits for R8C/M16C (when TARGET_A16 14136ac495dSmrg is true) and 24 bits for M32CM/M32C (when TARGET_A24 is true), but 14236ac495dSmrg 24-bit pointers are stored in 32-bit words. */ 14336ac495dSmrg #define UNITS_PER_WORD 2 14436ac495dSmrg #define POINTER_SIZE (TARGET_A16 ? 16 : 32) 14536ac495dSmrg #define POINTERS_EXTEND_UNSIGNED 1 14636ac495dSmrg /* We have a problem with libgcc2. It only defines two versions of 14736ac495dSmrg each function, one for "int" and one for "long long". Ie it assumes 14836ac495dSmrg that "sizeof (int) == sizeof (long)". For the M32C this is not true 14936ac495dSmrg and we need a third set of functions. We explicitly define 15036ac495dSmrg LIBGCC2_UNITS_PER_WORD here so that it is clear that we are expecting 15136ac495dSmrg to get the SI and DI versions from the libgcc2.c sources, and we 15236ac495dSmrg provide our own set of HI functions in m32c-lib2.c, which is why this 15336ac495dSmrg definition is surrounded by #ifndef..#endif. */ 15436ac495dSmrg #ifndef LIBGCC2_UNITS_PER_WORD 15536ac495dSmrg #define LIBGCC2_UNITS_PER_WORD 4 15636ac495dSmrg #endif 15736ac495dSmrg 15836ac495dSmrg /* These match the alignment enforced by the two types of stack operations. */ 15936ac495dSmrg #define PARM_BOUNDARY (TARGET_A16 ? 8 : 16) 16036ac495dSmrg #define STACK_BOUNDARY (TARGET_A16 ? 8 : 16) 16136ac495dSmrg 16236ac495dSmrg /* We do this because we care more about space than about speed. For 16336ac495dSmrg the chips with 16-bit busses, we could set these to 16 if 16436ac495dSmrg desired. */ 16536ac495dSmrg #define FUNCTION_BOUNDARY 8 16636ac495dSmrg #define BIGGEST_ALIGNMENT 8 16736ac495dSmrg 16836ac495dSmrg /* Since we have a maximum structure alignment of 8 there 16936ac495dSmrg is no need to enforce any alignment of bitfield types. */ 17036ac495dSmrg #undef PCC_BITFIELD_TYPE_MATTERS 17136ac495dSmrg #define PCC_BITFIELD_TYPE_MATTERS 0 17236ac495dSmrg 17336ac495dSmrg #define STRICT_ALIGNMENT 0 17436ac495dSmrg #define SLOW_BYTE_ACCESS 1 17536ac495dSmrg 17636ac495dSmrg /* Layout of Source Language Data Types */ 17736ac495dSmrg 17836ac495dSmrg #define INT_TYPE_SIZE 16 17936ac495dSmrg #define SHORT_TYPE_SIZE 16 18036ac495dSmrg #define LONG_TYPE_SIZE 32 18136ac495dSmrg #define LONG_LONG_TYPE_SIZE 64 18236ac495dSmrg 18336ac495dSmrg #define FLOAT_TYPE_SIZE 32 18436ac495dSmrg #define DOUBLE_TYPE_SIZE 64 18536ac495dSmrg #define LONG_DOUBLE_TYPE_SIZE 64 18636ac495dSmrg 18736ac495dSmrg #define DEFAULT_SIGNED_CHAR 1 18836ac495dSmrg 18936ac495dSmrg #undef PTRDIFF_TYPE 19036ac495dSmrg #define PTRDIFF_TYPE (TARGET_A16 ? "int" : "long int") 19136ac495dSmrg 19236ac495dSmrg #undef UINTPTR_TYPE 19336ac495dSmrg #define UINTPTR_TYPE (TARGET_A16 ? "unsigned int" : "long unsigned int") 19436ac495dSmrg 19536ac495dSmrg #undef SIZE_TYPE 19636ac495dSmrg #define SIZE_TYPE "unsigned int" 19736ac495dSmrg 19836ac495dSmrg #undef WCHAR_TYPE 19936ac495dSmrg #define WCHAR_TYPE "long int" 20036ac495dSmrg 20136ac495dSmrg #undef WCHAR_TYPE_SIZE 20236ac495dSmrg #define WCHAR_TYPE_SIZE 32 20336ac495dSmrg 20436ac495dSmrg /* REGISTER USAGE */ 20536ac495dSmrg 20636ac495dSmrg /* Register Basics */ 20736ac495dSmrg 20836ac495dSmrg /* Register layout: 20936ac495dSmrg 21036ac495dSmrg [r0h][r0l] $r0 (16 bits, or two 8-bit halves) 21136ac495dSmrg [--------] $r2 (16 bits) 21236ac495dSmrg [r1h][r1l] $r1 (16 bits, or two 8-bit halves) 21336ac495dSmrg [--------] $r3 (16 bits) 21436ac495dSmrg [---][--------] $a0 (might be 24 bits) 21536ac495dSmrg [---][--------] $a1 (might be 24 bits) 21636ac495dSmrg [---][--------] $sb (might be 24 bits) 21736ac495dSmrg [---][--------] $fb (might be 24 bits) 21836ac495dSmrg [---][--------] $sp (might be 24 bits) 21936ac495dSmrg [-------------] $pc (20 or 24 bits) 22036ac495dSmrg [---] $flg (CPU flags) 22136ac495dSmrg [---][--------] $argp (virtual) 22236ac495dSmrg [--------] $mem0 (all 16 bits) 22336ac495dSmrg . . . 22436ac495dSmrg [--------] $mem14 22536ac495dSmrg */ 22636ac495dSmrg 22736ac495dSmrg #define FIRST_PSEUDO_REGISTER 20 22836ac495dSmrg 22936ac495dSmrg /* Note that these two tables are modified based on which CPU family 23036ac495dSmrg you select; see m32c_conditional_register_usage for details. */ 23136ac495dSmrg 23236ac495dSmrg /* r0 r2 r1 r3 - a0 a1 sb fb - sp pc flg argp - mem0..mem14 */ 23336ac495dSmrg #define FIXED_REGISTERS { 0, 0, 0, 0, \ 23436ac495dSmrg 0, 0, 1, 0, \ 23536ac495dSmrg 1, 1, 0, 1, \ 23636ac495dSmrg 0, 0, 0, 0, 0, 0, 0, 0 } 23736ac495dSmrg #define CALL_USED_REGISTERS { 1, 1, 1, 1, \ 23836ac495dSmrg 1, 1, 1, 0, \ 23936ac495dSmrg 1, 1, 1, 1, \ 24036ac495dSmrg 1, 1, 1, 1, 1, 1, 1, 1 } 24136ac495dSmrg 24236ac495dSmrg /* The *_REGNO theme matches m32c.md and most register number 24336ac495dSmrg arguments; the PC_REGNUM is the odd one out. */ 24436ac495dSmrg #ifndef PC_REGNO 24536ac495dSmrg #define PC_REGNO 9 24636ac495dSmrg #endif 24736ac495dSmrg #define PC_REGNUM PC_REGNO 24836ac495dSmrg 24936ac495dSmrg /* Order of Allocation of Registers */ 25036ac495dSmrg 25136ac495dSmrg #define REG_ALLOC_ORDER { \ 25236ac495dSmrg 0, 1, 2, 3, 4, 5, /* r0..r3, a0, a1 */ \ 25336ac495dSmrg 12, 13, 14, 15, 16, 17, 18, 19, /* mem0..mem7 */ \ 25436ac495dSmrg 6, 7, 8, 9, 10, 11 /* sb, fb, sp, pc, flg, ap */ } 25536ac495dSmrg 25636ac495dSmrg /* How Values Fit in Registers */ 25736ac495dSmrg 25836ac495dSmrg #define AVOID_CCMODE_COPIES 25936ac495dSmrg 26036ac495dSmrg /* Register Classes */ 26136ac495dSmrg 26236ac495dSmrg /* Most registers are special purpose in some form or another, so this 26336ac495dSmrg table is pretty big. Class names are used for constraints also; 26436ac495dSmrg for example the HL_REGS class (HL below) is "Rhl" in the md files. 26536ac495dSmrg See m32c_reg_class_from_constraint for the mapping. There's some 26636ac495dSmrg duplication so that we can better isolate the reason for using 26736ac495dSmrg constraints in the md files from the actual registers used; for 26836ac495dSmrg example we may want to exclude a1a0 from SI_REGS in the future, 26936ac495dSmrg without precluding their use as HImode registers. */ 27036ac495dSmrg 27136ac495dSmrg /* m7654 - m3210 - argp flg pc sp - fb sb a1 a0 - r3 r1 r2 r0 */ 27236ac495dSmrg /* mmPAR */ 27336ac495dSmrg #define REG_CLASS_CONTENTS \ 27436ac495dSmrg { { 0x00000000 }, /* NO */\ 27536ac495dSmrg { 0x00000100 }, /* SP - sp */\ 27636ac495dSmrg { 0x00000080 }, /* FB - fb */\ 27736ac495dSmrg { 0x00000040 }, /* SB - sb */\ 27836ac495dSmrg { 0x000001c0 }, /* CR - sb fb sp */\ 27936ac495dSmrg { 0x00000001 }, /* R0 - r0 */\ 28036ac495dSmrg { 0x00000004 }, /* R1 - r1 */\ 28136ac495dSmrg { 0x00000002 }, /* R2 - r2 */\ 28236ac495dSmrg { 0x00000008 }, /* R3 - r3 */\ 28336ac495dSmrg { 0x00000003 }, /* R02 - r0r2 */\ 28436ac495dSmrg { 0x0000000c }, /* R13 - r1r3 */\ 28536ac495dSmrg { 0x00000005 }, /* HL - r0 r1 */\ 28636ac495dSmrg { 0x0000000a }, /* R23 - r2 r3 */\ 28736ac495dSmrg { 0x0000000f }, /* R03 - r0r2 r1r3 */\ 28836ac495dSmrg { 0x00000010 }, /* A0 - a0 */\ 28936ac495dSmrg { 0x00000020 }, /* A1 - a1 */\ 29036ac495dSmrg { 0x00000030 }, /* A - a0 a1 */\ 29136ac495dSmrg { 0x000000f0 }, /* AD - a0 a1 sb fp */\ 29236ac495dSmrg { 0x000001f0 }, /* PS - a0 a1 sb fp sp */\ 29336ac495dSmrg { 0x00000033 }, /* R02A - r0r2 a0 a1 */ \ 29436ac495dSmrg { 0x0000003f }, /* RA - r0 r1 r2 r3 a0 a1 */\ 29536ac495dSmrg { 0x0000007f }, /* GENERAL */\ 29636ac495dSmrg { 0x00000400 }, /* FLG */\ 29736ac495dSmrg { 0x000001ff }, /* HC - r0l r1 r2 r3 a0 a1 sb fb sp */\ 29836ac495dSmrg { 0x000ff000 }, /* MEM */\ 29936ac495dSmrg { 0x000ff003 }, /* R02_A_MEM */\ 30036ac495dSmrg { 0x000ff005 }, /* A_HL_MEM */\ 30136ac495dSmrg { 0x000ff00c }, /* R1_R3_A_MEM */\ 30236ac495dSmrg { 0x000ff00f }, /* R03_MEM */\ 30336ac495dSmrg { 0x000ff03f }, /* A_HI_MEM */\ 30436ac495dSmrg { 0x000ff0ff }, /* A_AD_CR_MEM_SI */\ 30536ac495dSmrg { 0x000ff5ff }, /* ALL */\ 30636ac495dSmrg } 30736ac495dSmrg 30836ac495dSmrg #define QI_REGS HL_REGS 30936ac495dSmrg #define HI_REGS RA_REGS 31036ac495dSmrg #define SI_REGS R03_REGS 31136ac495dSmrg #define DI_REGS R03_REGS 31236ac495dSmrg 31336ac495dSmrg enum reg_class 31436ac495dSmrg { 31536ac495dSmrg NO_REGS, 31636ac495dSmrg SP_REGS, 31736ac495dSmrg FB_REGS, 31836ac495dSmrg SB_REGS, 31936ac495dSmrg CR_REGS, 32036ac495dSmrg R0_REGS, 32136ac495dSmrg R1_REGS, 32236ac495dSmrg R2_REGS, 32336ac495dSmrg R3_REGS, 32436ac495dSmrg R02_REGS, 32536ac495dSmrg R13_REGS, 32636ac495dSmrg HL_REGS, 32736ac495dSmrg R23_REGS, 32836ac495dSmrg R03_REGS, 32936ac495dSmrg A0_REGS, 33036ac495dSmrg A1_REGS, 33136ac495dSmrg A_REGS, 33236ac495dSmrg AD_REGS, 33336ac495dSmrg PS_REGS, 33436ac495dSmrg R02A_REGS, 33536ac495dSmrg RA_REGS, 33636ac495dSmrg GENERAL_REGS, 33736ac495dSmrg FLG_REGS, 33836ac495dSmrg HC_REGS, 33936ac495dSmrg MEM_REGS, 34036ac495dSmrg R02_A_MEM_REGS, 34136ac495dSmrg A_HL_MEM_REGS, 34236ac495dSmrg R1_R3_A_MEM_REGS, 34336ac495dSmrg R03_MEM_REGS, 34436ac495dSmrg A_HI_MEM_REGS, 34536ac495dSmrg A_AD_CR_MEM_SI_REGS, 34636ac495dSmrg ALL_REGS, 34736ac495dSmrg LIM_REG_CLASSES 34836ac495dSmrg }; 34936ac495dSmrg 35036ac495dSmrg #define N_REG_CLASSES LIM_REG_CLASSES 35136ac495dSmrg 35236ac495dSmrg #define REG_CLASS_NAMES {\ 35336ac495dSmrg "NO_REGS", \ 35436ac495dSmrg "SP_REGS", \ 35536ac495dSmrg "FB_REGS", \ 35636ac495dSmrg "SB_REGS", \ 35736ac495dSmrg "CR_REGS", \ 35836ac495dSmrg "R0_REGS", \ 35936ac495dSmrg "R1_REGS", \ 36036ac495dSmrg "R2_REGS", \ 36136ac495dSmrg "R3_REGS", \ 36236ac495dSmrg "R02_REGS", \ 36336ac495dSmrg "R13_REGS", \ 36436ac495dSmrg "HL_REGS", \ 36536ac495dSmrg "R23_REGS", \ 36636ac495dSmrg "R03_REGS", \ 36736ac495dSmrg "A0_REGS", \ 36836ac495dSmrg "A1_REGS", \ 36936ac495dSmrg "A_REGS", \ 37036ac495dSmrg "AD_REGS", \ 37136ac495dSmrg "PS_REGS", \ 37236ac495dSmrg "R02A_REGS", \ 37336ac495dSmrg "RA_REGS", \ 37436ac495dSmrg "GENERAL_REGS", \ 37536ac495dSmrg "FLG_REGS", \ 37636ac495dSmrg "HC_REGS", \ 37736ac495dSmrg "MEM_REGS", \ 37836ac495dSmrg "R02_A_MEM_REGS", \ 37936ac495dSmrg "A_HL_MEM_REGS", \ 38036ac495dSmrg "R1_R3_A_MEM_REGS", \ 38136ac495dSmrg "R03_MEM_REGS", \ 38236ac495dSmrg "A_HI_MEM_REGS", \ 38336ac495dSmrg "A_AD_CR_MEM_SI_REGS", \ 38436ac495dSmrg "ALL_REGS", \ 38536ac495dSmrg } 38636ac495dSmrg 38736ac495dSmrg #define REGNO_REG_CLASS(R) m32c_regno_reg_class (R) 38836ac495dSmrg 38936ac495dSmrg /* We support simple displacements off address registers, nothing else. */ 39036ac495dSmrg #define BASE_REG_CLASS A_REGS 39136ac495dSmrg #define INDEX_REG_CLASS NO_REGS 39236ac495dSmrg 39336ac495dSmrg /* We primarily use the new "long" constraint names, with the initial 39436ac495dSmrg letter classifying the constraint type and following letters 39536ac495dSmrg specifying which. The types are: 39636ac495dSmrg 39736ac495dSmrg I - integer values 39836ac495dSmrg R - register classes 39936ac495dSmrg S - memory references (M was used) 40036ac495dSmrg A - addresses (currently unused) 40136ac495dSmrg */ 40236ac495dSmrg 40336ac495dSmrg #define REGNO_OK_FOR_BASE_P(NUM) m32c_regno_ok_for_base_p (NUM) 40436ac495dSmrg #define REGNO_OK_FOR_INDEX_P(NUM) 0 40536ac495dSmrg 40636ac495dSmrg #define LIMIT_RELOAD_CLASS(MODE,CLASS) \ 40736ac495dSmrg (enum reg_class) m32c_limit_reload_class (MODE, CLASS) 40836ac495dSmrg 40936ac495dSmrg #define SECONDARY_RELOAD_CLASS(CLASS,MODE,X) \ 41036ac495dSmrg (enum reg_class) m32c_secondary_reload_class (CLASS, MODE, X) 41136ac495dSmrg 41236ac495dSmrg #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P hook_bool_mode_true 41336ac495dSmrg 41436ac495dSmrg /* STACK AND CALLING */ 41536ac495dSmrg 41636ac495dSmrg /* Frame Layout */ 41736ac495dSmrg 41836ac495dSmrg /* Standard push/pop stack, no surprises here. */ 41936ac495dSmrg 42036ac495dSmrg #define STACK_GROWS_DOWNWARD 1 42136ac495dSmrg #define STACK_PUSH_CODE PRE_DEC 42236ac495dSmrg #define FRAME_GROWS_DOWNWARD 1 42336ac495dSmrg 42436ac495dSmrg #define FIRST_PARM_OFFSET(F) 0 42536ac495dSmrg 42636ac495dSmrg #define RETURN_ADDR_RTX(COUNT,FA) m32c_return_addr_rtx (COUNT) 42736ac495dSmrg 42836ac495dSmrg #define INCOMING_RETURN_ADDR_RTX m32c_incoming_return_addr_rtx() 42936ac495dSmrg #define INCOMING_FRAME_SP_OFFSET (TARGET_A24 ? 4 : 3) 43036ac495dSmrg 43136ac495dSmrg /* Exception Handling Support */ 43236ac495dSmrg 43336ac495dSmrg #define EH_RETURN_DATA_REGNO(N) m32c_eh_return_data_regno (N) 43436ac495dSmrg #define EH_RETURN_STACKADJ_RTX m32c_eh_return_stackadj_rtx () 43536ac495dSmrg 43636ac495dSmrg /* Registers That Address the Stack Frame */ 43736ac495dSmrg 43836ac495dSmrg #ifndef FP_REGNO 43936ac495dSmrg #define FP_REGNO 7 44036ac495dSmrg #endif 44136ac495dSmrg #ifndef SP_REGNO 44236ac495dSmrg #define SP_REGNO 8 44336ac495dSmrg #endif 44436ac495dSmrg #define AP_REGNO 11 44536ac495dSmrg 44636ac495dSmrg #define STACK_POINTER_REGNUM SP_REGNO 44736ac495dSmrg #define FRAME_POINTER_REGNUM FP_REGNO 44836ac495dSmrg #define ARG_POINTER_REGNUM AP_REGNO 44936ac495dSmrg 45036ac495dSmrg /* The static chain must be pointer-capable. */ 45136ac495dSmrg #define STATIC_CHAIN_REGNUM A0_REGNO 45236ac495dSmrg 45336ac495dSmrg #define DWARF_FRAME_REGISTERS 20 45436ac495dSmrg #define DWARF_FRAME_REGNUM(N) m32c_dwarf_frame_regnum (N) 45536ac495dSmrg #define DBX_REGISTER_NUMBER(N) m32c_dwarf_frame_regnum (N) 45636ac495dSmrg 45736ac495dSmrg #undef ASM_PREFERRED_EH_DATA_FORMAT 45836ac495dSmrg /* This is the same as the default in practice, except that by making 45936ac495dSmrg it explicit we tell binutils what size pointers to use. */ 46036ac495dSmrg #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ 46136ac495dSmrg (TARGET_A16 ? DW_EH_PE_udata2 : DW_EH_PE_udata4) 46236ac495dSmrg 46336ac495dSmrg /* Eliminating Frame Pointer and Arg Pointer */ 46436ac495dSmrg 46536ac495dSmrg #define ELIMINABLE_REGS \ 46636ac495dSmrg {{AP_REGNO, SP_REGNO}, \ 46736ac495dSmrg {AP_REGNO, FB_REGNO}, \ 46836ac495dSmrg {FB_REGNO, SP_REGNO}} 46936ac495dSmrg 47036ac495dSmrg #define INITIAL_ELIMINATION_OFFSET(FROM,TO,VAR) \ 47136ac495dSmrg (VAR) = m32c_initial_elimination_offset(FROM,TO) 47236ac495dSmrg 47336ac495dSmrg /* Passing Function Arguments on the Stack */ 47436ac495dSmrg 47536ac495dSmrg #define PUSH_ARGS 1 47636ac495dSmrg #define PUSH_ROUNDING(N) m32c_push_rounding (N) 47736ac495dSmrg #define CALL_POPS_ARGS(C) 0 47836ac495dSmrg 47936ac495dSmrg /* Passing Arguments in Registers */ 48036ac495dSmrg 48136ac495dSmrg typedef struct m32c_cumulative_args 48236ac495dSmrg { 48336ac495dSmrg /* For address of return value buffer (structures are returned by 48436ac495dSmrg passing the address of a buffer as an invisible first argument. 48536ac495dSmrg This identifies it). If set, the current parameter will be put 48636ac495dSmrg on the stack, regardless of type. */ 48736ac495dSmrg int force_mem; 48836ac495dSmrg /* First parm is 1, parm 0 is hidden pointer for returning 48936ac495dSmrg aggregates. */ 49036ac495dSmrg int parm_num; 49136ac495dSmrg } m32c_cumulative_args; 49236ac495dSmrg 49336ac495dSmrg #define CUMULATIVE_ARGS m32c_cumulative_args 49436ac495dSmrg #define INIT_CUMULATIVE_ARGS(CA,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \ 49536ac495dSmrg m32c_init_cumulative_args (&(CA),FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) 49636ac495dSmrg #define FUNCTION_ARG_REGNO_P(r) m32c_function_arg_regno_p (r) 49736ac495dSmrg 49836ac495dSmrg /* How Large Values Are Returned */ 49936ac495dSmrg 50036ac495dSmrg #define DEFAULT_PCC_STRUCT_RETURN 1 50136ac495dSmrg 50236ac495dSmrg /* Function Entry and Exit */ 50336ac495dSmrg 50436ac495dSmrg #define EXIT_IGNORE_STACK 0 50536ac495dSmrg #define EPILOGUE_USES(REGNO) m32c_epilogue_uses(REGNO) 50636ac495dSmrg #define EH_USES(REGNO) 0 /* FIXME */ 50736ac495dSmrg 50836ac495dSmrg /* Generating Code for Profiling */ 50936ac495dSmrg 51036ac495dSmrg #define FUNCTION_PROFILER(FILE,LABELNO) 51136ac495dSmrg 51236ac495dSmrg /* Implementing the Varargs Macros */ 51336ac495dSmrg 51436ac495dSmrg /* Trampolines for Nested Functions */ 51536ac495dSmrg 51636ac495dSmrg #define TRAMPOLINE_SIZE m32c_trampoline_size () 51736ac495dSmrg #define TRAMPOLINE_ALIGNMENT m32c_trampoline_alignment () 51836ac495dSmrg 51936ac495dSmrg /* Addressing Modes */ 52036ac495dSmrg 52136ac495dSmrg #define HAVE_PRE_DECREMENT 1 52236ac495dSmrg #define HAVE_POST_INCREMENT 1 52336ac495dSmrg #define MAX_REGS_PER_ADDRESS 1 52436ac495dSmrg 52536ac495dSmrg /* This is passed to the macros below, so that they can be implemented 52636ac495dSmrg in m32c.c. */ 52736ac495dSmrg #ifdef REG_OK_STRICT 52836ac495dSmrg #define REG_OK_STRICT_V 1 52936ac495dSmrg #else 53036ac495dSmrg #define REG_OK_STRICT_V 0 53136ac495dSmrg #endif 53236ac495dSmrg 53336ac495dSmrg #define REG_OK_FOR_BASE_P(X) m32c_reg_ok_for_base_p (X, REG_OK_STRICT_V) 53436ac495dSmrg #define REG_OK_FOR_INDEX_P(X) 0 53536ac495dSmrg 53636ac495dSmrg /* #define FIND_BASE_TERM(X) when we do unspecs for symrefs */ 53736ac495dSmrg 53836ac495dSmrg #define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \ 53936ac495dSmrg if (m32c_legitimize_reload_address(&(X),MODE,OPNUM,TYPE,IND_LEVELS)) \ 54036ac495dSmrg goto WIN; 54136ac495dSmrg 54236ac495dSmrg /* Address spaces. */ 54336ac495dSmrg #define ADDR_SPACE_FAR 1 54436ac495dSmrg 54536ac495dSmrg 54636ac495dSmrg /* Condition Code Status */ 54736ac495dSmrg 54836ac495dSmrg #define REVERSIBLE_CC_MODE(MODE) 1 54936ac495dSmrg 55036ac495dSmrg /* Dividing the Output into Sections (Texts, Data, ...) */ 55136ac495dSmrg 55236ac495dSmrg #define TEXT_SECTION_ASM_OP ".text" 55336ac495dSmrg #define DATA_SECTION_ASM_OP ".data" 55436ac495dSmrg #define BSS_SECTION_ASM_OP ".bss" 55536ac495dSmrg 55636ac495dSmrg #define CTOR_LIST_BEGIN 55736ac495dSmrg #define CTOR_LIST_END 55836ac495dSmrg #define DTOR_LIST_BEGIN 55936ac495dSmrg #define DTOR_LIST_END 56036ac495dSmrg #define CTORS_SECTION_ASM_OP "\t.section\t.init_array,\"aw\",%init_array" 56136ac495dSmrg #define DTORS_SECTION_ASM_OP "\t.section\t.fini_array,\"aw\",%fini_array" 56236ac495dSmrg #define INIT_ARRAY_SECTION_ASM_OP "\t.section\t.init_array,\"aw\",%init_array" 56336ac495dSmrg #define FINI_ARRAY_SECTION_ASM_OP "\t.section\t.fini_array,\"aw\",%fini_array" 56436ac495dSmrg 56536ac495dSmrg /* The Overall Framework of an Assembler File */ 56636ac495dSmrg 56736ac495dSmrg #define ASM_COMMENT_START ";" 56836ac495dSmrg #define ASM_APP_ON "" 56936ac495dSmrg #define ASM_APP_OFF "" 57036ac495dSmrg 57136ac495dSmrg /* Output and Generation of Labels */ 57236ac495dSmrg 57336ac495dSmrg #define GLOBAL_ASM_OP "\t.global\t" 57436ac495dSmrg 57536ac495dSmrg /* Output of Assembler Instructions */ 57636ac495dSmrg 57736ac495dSmrg #define REGISTER_NAMES { \ 57836ac495dSmrg "r0", "r2", "r1", "r3", \ 57936ac495dSmrg "a0", "a1", "sb", "fb", "sp", \ 58036ac495dSmrg "pc", "flg", "argp", \ 58136ac495dSmrg "mem0", "mem2", "mem4", "mem6", "mem8", "mem10", "mem12", "mem14", \ 58236ac495dSmrg } 58336ac495dSmrg 58436ac495dSmrg #define ADDITIONAL_REGISTER_NAMES { \ 58536ac495dSmrg {"r0l", 0}, \ 58636ac495dSmrg {"r1l", 2}, \ 58736ac495dSmrg {"r0r2", 0}, \ 58836ac495dSmrg {"r1r3", 2}, \ 58936ac495dSmrg {"a0a1", 4}, \ 59036ac495dSmrg {"r0r2r1r3", 0} } 59136ac495dSmrg 59236ac495dSmrg #undef USER_LABEL_PREFIX 59336ac495dSmrg #define USER_LABEL_PREFIX "_" 59436ac495dSmrg 59536ac495dSmrg #define ASM_OUTPUT_REG_PUSH(S,R) m32c_output_reg_push (S, R) 59636ac495dSmrg #define ASM_OUTPUT_REG_POP(S,R) m32c_output_reg_pop (S, R) 59736ac495dSmrg 59836ac495dSmrg #define ASM_OUTPUT_ALIGNED_DECL_COMMON(STREAM, DECL, NAME, SIZE, ALIGNMENT) \ 59936ac495dSmrg m32c_output_aligned_common (STREAM, DECL, NAME, SIZE, ALIGNMENT, 1) 60036ac495dSmrg 60136ac495dSmrg #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGNMENT) \ 60236ac495dSmrg m32c_output_aligned_common (STREAM, DECL, NAME, SIZE, ALIGNMENT, 0) 60336ac495dSmrg 60436ac495dSmrg 60536ac495dSmrg /* Output of Dispatch Tables */ 60636ac495dSmrg 60736ac495dSmrg #define ASM_OUTPUT_ADDR_VEC_ELT(S,V) \ 60836ac495dSmrg fprintf (S, "\t.word L%d\n", V) 60936ac495dSmrg 61036ac495dSmrg /* Assembler Commands for Exception Regions */ 61136ac495dSmrg 61236ac495dSmrg #define DWARF_CIE_DATA_ALIGNMENT -1 61336ac495dSmrg 61436ac495dSmrg /* Assembler Commands for Alignment */ 61536ac495dSmrg 61636ac495dSmrg #define ASM_OUTPUT_ALIGN(STREAM,POWER) \ 61736ac495dSmrg fprintf (STREAM, "\t.p2align\t%d\n", POWER); 61836ac495dSmrg 61936ac495dSmrg /* Controlling Debugging Information Format */ 62036ac495dSmrg 62136ac495dSmrg #define DWARF2_ADDR_SIZE 4 62236ac495dSmrg 62336ac495dSmrg /* Miscellaneous Parameters */ 62436ac495dSmrg 62536ac495dSmrg #define HAS_LONG_COND_BRANCH false 62636ac495dSmrg #define HAS_LONG_UNCOND_BRANCH true 62736ac495dSmrg #define CASE_VECTOR_MODE SImode 62836ac495dSmrg #define LOAD_EXTEND_OP(MEM) ZERO_EXTEND 62936ac495dSmrg 63036ac495dSmrg #define MOVE_MAX 4 63136ac495dSmrg 63236ac495dSmrg #define STORE_FLAG_VALUE 1 63336ac495dSmrg 63436ac495dSmrg /* 16- or 24-bit pointers */ 63536ac495dSmrg #define Pmode (TARGET_A16 ? HImode : PSImode) 63636ac495dSmrg #define FUNCTION_MODE QImode 63736ac495dSmrg 63836ac495dSmrg #define REGISTER_TARGET_PRAGMAS() m32c_register_pragmas() 63936ac495dSmrg 64036ac495dSmrg #endif 641