xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/m32c/m32c.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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