xref: /openbsd-src/gnu/gcc/gcc/config/m32c/m32c.h (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
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