annotate gcc/config/rl78/rl78.h @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* GCC backend definitions for the Renesas RL78 processor.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2011-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by Red Hat.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
8 under the terms of the GNU General Public License as published
kono
parents:
diff changeset
9 by the Free Software Foundation; either version 3, or (at your
kono
parents:
diff changeset
10 option) any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT
kono
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
kono
parents:
diff changeset
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
kono
parents:
diff changeset
15 License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 #define RL78_MUL_NONE (rl78_mul_type == MUL_NONE)
kono
parents:
diff changeset
23 #define RL78_MUL_G13 (rl78_mul_type == MUL_G13)
kono
parents:
diff changeset
24 #define RL78_MUL_G14 (rl78_mul_type == MUL_G14)
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 #define TARGET_G10 (rl78_cpu_type == CPU_G10)
kono
parents:
diff changeset
27 #define TARGET_G13 (rl78_cpu_type == CPU_G13)
kono
parents:
diff changeset
28 #define TARGET_G14 (rl78_cpu_type == CPU_G14)
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 #define TARGET_CPU_CPP_BUILTINS() \
kono
parents:
diff changeset
31 do \
kono
parents:
diff changeset
32 { \
kono
parents:
diff changeset
33 builtin_define ("__RL78__"); \
kono
parents:
diff changeset
34 builtin_assert ("cpu=RL78"); \
kono
parents:
diff changeset
35 \
kono
parents:
diff changeset
36 if (RL78_MUL_NONE) \
kono
parents:
diff changeset
37 builtin_define ("__RL78_MUL_NONE__"); \
kono
parents:
diff changeset
38 else if (RL78_MUL_G13) \
kono
parents:
diff changeset
39 builtin_define ("__RL78_MUL_G13__"); \
kono
parents:
diff changeset
40 else if (RL78_MUL_G14) \
kono
parents:
diff changeset
41 builtin_define ("__RL78_MUL_G14__"); \
kono
parents:
diff changeset
42 \
kono
parents:
diff changeset
43 if (TARGET_G10) \
kono
parents:
diff changeset
44 builtin_define ("__RL78_G10__"); \
kono
parents:
diff changeset
45 else if (TARGET_G13) \
kono
parents:
diff changeset
46 builtin_define ("__RL78_G13__"); \
kono
parents:
diff changeset
47 else if (TARGET_G14) \
kono
parents:
diff changeset
48 builtin_define ("__RL78_G14__"); \
kono
parents:
diff changeset
49 } \
kono
parents:
diff changeset
50 while (0)
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 #undef STARTFILE_SPEC
kono
parents:
diff changeset
53 #define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:crt0.o%s} crtbegin.o%s"
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 #undef ENDFILE_SPEC
kono
parents:
diff changeset
56 #define ENDFILE_SPEC "crtend.o%s crtn.o%s"
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 #undef ASM_SPEC
kono
parents:
diff changeset
59 #define ASM_SPEC "\
kono
parents:
diff changeset
60 %{mrelax:-relax} \
kono
parents:
diff changeset
61 %{mg10:--mg10} \
kono
parents:
diff changeset
62 %{mg13:--mg13} \
kono
parents:
diff changeset
63 %{mg14:--mg14} \
kono
parents:
diff changeset
64 %{mrl78:--mg14} \
kono
parents:
diff changeset
65 %{mcpu=g10:--mg10} \
kono
parents:
diff changeset
66 %{mcpu=g13:--mg13} \
kono
parents:
diff changeset
67 %{mcpu=g14:--mg14} \
kono
parents:
diff changeset
68 %{mcpu=rl78:--mg14} \
kono
parents:
diff changeset
69 "
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 #undef LINK_SPEC
kono
parents:
diff changeset
72 #define LINK_SPEC "\
kono
parents:
diff changeset
73 %{mrelax:-relax} \
kono
parents:
diff changeset
74 %{!r:--gc-sections} \
kono
parents:
diff changeset
75 "
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 #undef LIB_SPEC
kono
parents:
diff changeset
78 #define LIB_SPEC " \
kono
parents:
diff changeset
79 --start-group \
kono
parents:
diff changeset
80 -lc \
kono
parents:
diff changeset
81 -lsim \
kono
parents:
diff changeset
82 %{fprofile-arcs|fprofile-generate|coverage:-lgcov} \
kono
parents:
diff changeset
83 --end-group \
kono
parents:
diff changeset
84 %{!T*: %{msim:%Trl78-sim.ld}%{!msim:%Trl78.ld}} \
kono
parents:
diff changeset
85 "
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 #define BITS_BIG_ENDIAN 0
kono
parents:
diff changeset
89 #define BYTES_BIG_ENDIAN 0
kono
parents:
diff changeset
90 #define WORDS_BIG_ENDIAN 0
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 #ifdef IN_LIBGCC2
kono
parents:
diff changeset
93 /* This is to get correct SI and DI modes in libgcc2.c (32 and 64 bits). */
kono
parents:
diff changeset
94 #define UNITS_PER_WORD 4
kono
parents:
diff changeset
95 /* We have a problem with libgcc2. It only defines two versions of
kono
parents:
diff changeset
96 each function, one for "int" and one for "long long". Ie it assumes
kono
parents:
diff changeset
97 that "sizeof (int) == sizeof (long)". For the RL78 this is not true
kono
parents:
diff changeset
98 and we need a third set of functions. We explicitly define
kono
parents:
diff changeset
99 LIBGCC2_UNITS_PER_WORD here so that it is clear that we are expecting
kono
parents:
diff changeset
100 to get the SI and DI versions from the libgcc2.c sources, and we
kono
parents:
diff changeset
101 provide our own set of HI functions, which is why this
kono
parents:
diff changeset
102 definition is surrounded by #ifndef..#endif. */
kono
parents:
diff changeset
103 #ifndef LIBGCC2_UNITS_PER_WORD
kono
parents:
diff changeset
104 #define LIBGCC2_UNITS_PER_WORD 4
kono
parents:
diff changeset
105 #endif
kono
parents:
diff changeset
106 #else
kono
parents:
diff changeset
107 /* Actual width of a word, in units (bytes). */
kono
parents:
diff changeset
108 #define UNITS_PER_WORD 1
kono
parents:
diff changeset
109 #endif
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 #define SHORT_TYPE_SIZE 16
kono
parents:
diff changeset
112 #define INT_TYPE_SIZE 16
kono
parents:
diff changeset
113 #define LONG_TYPE_SIZE 32
kono
parents:
diff changeset
114 #define LONG_LONG_TYPE_SIZE 64
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 #define FLOAT_TYPE_SIZE 32
kono
parents:
diff changeset
117 #define DOUBLE_TYPE_SIZE 32 /*64*/
kono
parents:
diff changeset
118 #define LONG_DOUBLE_TYPE_SIZE 64 /*DOUBLE_TYPE_SIZE*/
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 #define DEFAULT_SIGNED_CHAR 0
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 #define STRICT_ALIGNMENT 1
kono
parents:
diff changeset
123 #define FUNCTION_BOUNDARY 8
kono
parents:
diff changeset
124 #define BIGGEST_ALIGNMENT 16
kono
parents:
diff changeset
125 #define STACK_BOUNDARY 16
kono
parents:
diff changeset
126 #define PARM_BOUNDARY 16
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 #define STACK_GROWS_DOWNWARD 1
kono
parents:
diff changeset
129 #define FRAME_GROWS_DOWNWARD 1
kono
parents:
diff changeset
130 #define FIRST_PARM_OFFSET(FNDECL) 0
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 #define MAX_REGS_PER_ADDRESS 1
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 #define Pmode HImode
kono
parents:
diff changeset
135 #define POINTER_SIZE 16
kono
parents:
diff changeset
136 #undef SIZE_TYPE
kono
parents:
diff changeset
137 #define SIZE_TYPE "unsigned int"
kono
parents:
diff changeset
138 #undef PTRDIFF_TYPE
kono
parents:
diff changeset
139 #define PTRDIFF_TYPE "int"
kono
parents:
diff changeset
140 #undef WCHAR_TYPE
kono
parents:
diff changeset
141 #define WCHAR_TYPE "long int"
kono
parents:
diff changeset
142 #undef WCHAR_TYPE_SIZE
kono
parents:
diff changeset
143 #define WCHAR_TYPE_SIZE BITS_PER_WORD
kono
parents:
diff changeset
144 #define POINTERS_EXTEND_UNSIGNED 1
kono
parents:
diff changeset
145 #define FUNCTION_MODE HImode
kono
parents:
diff changeset
146 #define CASE_VECTOR_MODE Pmode
kono
parents:
diff changeset
147 #define WORD_REGISTER_OPERATIONS 1
kono
parents:
diff changeset
148 #define HAS_LONG_COND_BRANCH 0
kono
parents:
diff changeset
149 #define HAS_LONG_UNCOND_BRANCH 0
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 #define MOVE_MAX 2
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 #define ADDR_SPACE_NEAR 1
kono
parents:
diff changeset
154 #define ADDR_SPACE_FAR 2
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 #define HAVE_PRE_DECCREMENT 0
kono
parents:
diff changeset
157 #define HAVE_POST_INCREMENT 0
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 #define MOVE_RATIO(SPEED) ((SPEED) ? 24 : 16)
kono
parents:
diff changeset
160 #define SLOW_BYTE_ACCESS 0
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 #define STORE_FLAG_VALUE 1
kono
parents:
diff changeset
163 #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 /* The RL78 has four register banks. Normal operation uses RB0 as
kono
parents:
diff changeset
167 real registers, RB1 and RB2 as "virtual" registers (because we know
kono
parents:
diff changeset
168 they'll be there, and not used as variables), and RB3 is reserved
kono
parents:
diff changeset
169 for interrupt handlers. The virtual registers are accessed as
kono
parents:
diff changeset
170 SADDRs:
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 FFEE0-FFEE7 RB0
kono
parents:
diff changeset
173 FFEE8-FFEEF RB1
kono
parents:
diff changeset
174 FFEF0-FFEF7 RB2
kono
parents:
diff changeset
175 FFEF8-FFEFF RB3
kono
parents:
diff changeset
176 */
kono
parents:
diff changeset
177 #define REGISTER_NAMES \
kono
parents:
diff changeset
178 { \
kono
parents:
diff changeset
179 "x", "a", "c", "b", "e", "d", "l", "h", \
kono
parents:
diff changeset
180 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \
kono
parents:
diff changeset
181 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", \
kono
parents:
diff changeset
182 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", \
kono
parents:
diff changeset
183 "sp", "ap", "psw", "es", "cs" \
kono
parents:
diff changeset
184 }
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 #define ADDITIONAL_REGISTER_NAMES \
kono
parents:
diff changeset
187 { \
kono
parents:
diff changeset
188 { "ax", 0 }, \
kono
parents:
diff changeset
189 { "bc", 2 }, \
kono
parents:
diff changeset
190 { "de", 4 }, \
kono
parents:
diff changeset
191 { "hl", 6 }, \
kono
parents:
diff changeset
192 { "rp0", 0 }, \
kono
parents:
diff changeset
193 { "rp1", 2 }, \
kono
parents:
diff changeset
194 { "rp2", 4 }, \
kono
parents:
diff changeset
195 { "rp3", 6 }, \
kono
parents:
diff changeset
196 { "r0", 0 }, \
kono
parents:
diff changeset
197 { "r1", 1 }, \
kono
parents:
diff changeset
198 { "r2", 2 }, \
kono
parents:
diff changeset
199 { "r3", 3 }, \
kono
parents:
diff changeset
200 { "r4", 4 }, \
kono
parents:
diff changeset
201 { "r5", 5 }, \
kono
parents:
diff changeset
202 { "r6", 6 }, \
kono
parents:
diff changeset
203 { "r7", 7 }, \
kono
parents:
diff changeset
204 }
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 enum reg_class
kono
parents:
diff changeset
207 {
kono
parents:
diff changeset
208 NO_REGS, /* No registers in set. */
kono
parents:
diff changeset
209 XREG,
kono
parents:
diff changeset
210 AREG,
kono
parents:
diff changeset
211 AXREG,
kono
parents:
diff changeset
212 CREG,
kono
parents:
diff changeset
213 BREG,
kono
parents:
diff changeset
214 BCREG,
kono
parents:
diff changeset
215 EREG,
kono
parents:
diff changeset
216 DREG,
kono
parents:
diff changeset
217 DEREG,
kono
parents:
diff changeset
218 LREG,
kono
parents:
diff changeset
219 HREG,
kono
parents:
diff changeset
220 HLREG,
kono
parents:
diff changeset
221 IDX_REGS,
kono
parents:
diff changeset
222 QI_REGS,
kono
parents:
diff changeset
223 SPREG,
kono
parents:
diff changeset
224 R8W_REGS,
kono
parents:
diff changeset
225 R10W_REGS,
kono
parents:
diff changeset
226 INT_REGS,
kono
parents:
diff changeset
227 V_REGS, /* Virtual registers. */
kono
parents:
diff changeset
228 GR_REGS, /* Integer registers. */
kono
parents:
diff changeset
229 PSWREG,
kono
parents:
diff changeset
230 ALL_REGS, /* All registers. */
kono
parents:
diff changeset
231 LIM_REG_CLASSES /* Max value + 1. */
kono
parents:
diff changeset
232 };
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 #define REG_CLASS_NAMES \
kono
parents:
diff changeset
235 { \
kono
parents:
diff changeset
236 "NO_REGS", \
kono
parents:
diff changeset
237 "XREG", \
kono
parents:
diff changeset
238 "AREG", \
kono
parents:
diff changeset
239 "AXREG", \
kono
parents:
diff changeset
240 "CREG", \
kono
parents:
diff changeset
241 "BREG", \
kono
parents:
diff changeset
242 "BCREG", \
kono
parents:
diff changeset
243 "EREG", \
kono
parents:
diff changeset
244 "DREG", \
kono
parents:
diff changeset
245 "DEREG", \
kono
parents:
diff changeset
246 "LREG", \
kono
parents:
diff changeset
247 "HREG", \
kono
parents:
diff changeset
248 "HLREG", \
kono
parents:
diff changeset
249 "IDX_REGS", \
kono
parents:
diff changeset
250 "QI_REGS", \
kono
parents:
diff changeset
251 "SPREG", \
kono
parents:
diff changeset
252 "R8W_REGS", \
kono
parents:
diff changeset
253 "R10W_REGS", \
kono
parents:
diff changeset
254 "INT_REGS", \
kono
parents:
diff changeset
255 "V_REGS", \
kono
parents:
diff changeset
256 "GR_REGS", \
kono
parents:
diff changeset
257 "PSWREG", \
kono
parents:
diff changeset
258 "ALL_REGS" \
kono
parents:
diff changeset
259 }
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 /* Note that no class may include the second register in $fp, because
kono
parents:
diff changeset
262 we treat $fp as a single HImode register. */
kono
parents:
diff changeset
263 #define REG_CLASS_CONTENTS \
kono
parents:
diff changeset
264 { \
kono
parents:
diff changeset
265 { 0x00000000, 0x00000000 }, /* No registers, */ \
kono
parents:
diff changeset
266 { 0x00000001, 0x00000000 }, \
kono
parents:
diff changeset
267 { 0x00000002, 0x00000000 }, \
kono
parents:
diff changeset
268 { 0x00000003, 0x00000000 }, \
kono
parents:
diff changeset
269 { 0x00000004, 0x00000000 }, \
kono
parents:
diff changeset
270 { 0x00000008, 0x00000000 }, \
kono
parents:
diff changeset
271 { 0x0000000c, 0x00000000 }, \
kono
parents:
diff changeset
272 { 0x00000010, 0x00000000 }, \
kono
parents:
diff changeset
273 { 0x00000020, 0x00000000 }, \
kono
parents:
diff changeset
274 { 0x00000030, 0x00000000 }, \
kono
parents:
diff changeset
275 { 0x00000040, 0x00000000 }, \
kono
parents:
diff changeset
276 { 0x00000080, 0x00000000 }, \
kono
parents:
diff changeset
277 { 0x000000c0, 0x00000000 }, \
kono
parents:
diff changeset
278 { 0x0000000c, 0x00000000 }, /* B and C - index regs. */ \
kono
parents:
diff changeset
279 { 0x000000ff, 0x00000000 }, /* all real registers. */ \
kono
parents:
diff changeset
280 { 0x00000000, 0x00000001 }, /* SP */ \
kono
parents:
diff changeset
281 { 0x00000300, 0x00000000 }, /* R8 - HImode */ \
kono
parents:
diff changeset
282 { 0x00000c00, 0x00000000 }, /* R10 - HImode */ \
kono
parents:
diff changeset
283 { 0xff000000, 0x00000000 }, /* INT - HImode */ \
kono
parents:
diff changeset
284 { 0xff7fff00, 0x00000000 }, /* Virtual registers. */ \
kono
parents:
diff changeset
285 { 0xff7fff00, 0x00000002 }, /* General registers. */ \
kono
parents:
diff changeset
286 { 0x04000000, 0x00000004 }, /* PSW. */ \
kono
parents:
diff changeset
287 { 0xff7fffff, 0x0000001f } /* All registers. */ \
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P hook_bool_mode_true
kono
parents:
diff changeset
291 #define N_REG_CLASSES (int) LIM_REG_CLASSES
kono
parents:
diff changeset
292 #define CLASS_MAX_NREGS(CLASS, MODE) ((GET_MODE_SIZE (MODE) \
kono
parents:
diff changeset
293 + UNITS_PER_WORD - 1) \
kono
parents:
diff changeset
294 / UNITS_PER_WORD)
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 #define GENERAL_REGS GR_REGS
kono
parents:
diff changeset
297 #define BASE_REG_CLASS V_REGS
kono
parents:
diff changeset
298 #define INDEX_REG_CLASS V_REGS
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 #define FIRST_PSEUDO_REGISTER 37
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 #define REGNO_REG_CLASS(REGNO) ((REGNO) < FIRST_PSEUDO_REGISTER \
kono
parents:
diff changeset
303 ? GR_REGS : NO_REGS)
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 #define FRAME_POINTER_REGNUM 22
kono
parents:
diff changeset
306 #define STACK_POINTER_REGNUM 32
kono
parents:
diff changeset
307 #define ARG_POINTER_REGNUM 33
kono
parents:
diff changeset
308 #define CC_REGNUM 34
kono
parents:
diff changeset
309 #define FUNC_RETURN_REGNUM 8
kono
parents:
diff changeset
310 #define STATIC_CHAIN_REGNUM 14
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 /* Trampolines are implemented with a separate data stack. The memory
kono
parents:
diff changeset
313 on stack only holds the function pointer for the chosen stub.
kono
parents:
diff changeset
314 */
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 #define TRAMPOLINE_SIZE 4
kono
parents:
diff changeset
317 #define TRAMPOLINE_ALIGNMENT 16
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 #define ELIMINABLE_REGS \
kono
parents:
diff changeset
320 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }, \
kono
parents:
diff changeset
321 { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM }, \
kono
parents:
diff changeset
322 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM }}
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
kono
parents:
diff changeset
325 (OFFSET) = rl78_initial_elimination_offset ((FROM), (TO))
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 #define FUNCTION_ARG_REGNO_P(N) 0
kono
parents:
diff changeset
329 #define FUNCTION_VALUE_REGNO_P(N) ((N) == 8)
kono
parents:
diff changeset
330 #define DEFAULT_PCC_STRUCT_RETURN 0
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 #define FIXED_REGISTERS \
kono
parents:
diff changeset
333 { \
kono
parents:
diff changeset
334 1,1,1,1, 1,1,1,1, \
kono
parents:
diff changeset
335 0,0,0,0, 0,0,0,0, \
kono
parents:
diff changeset
336 0,0,0,0, 0,0,1,1, \
kono
parents:
diff changeset
337 1,1,1,1, 1,1,1,1, \
kono
parents:
diff changeset
338 0, 1, 0, 1, 1 \
kono
parents:
diff changeset
339 }
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 #define CALL_USED_REGISTERS \
kono
parents:
diff changeset
342 { \
kono
parents:
diff changeset
343 1,1,1,1, 1,1,1,1, \
kono
parents:
diff changeset
344 1,1,1,1, 1,1,1,1, \
kono
parents:
diff changeset
345 0,0,0,0, 0,0,1,1, \
kono
parents:
diff changeset
346 1,1,1,1, 1,1,1,1, \
kono
parents:
diff changeset
347 0, 1, 1, 1, 1 \
kono
parents:
diff changeset
348 }
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 #define LIBCALL_VALUE(MODE) \
kono
parents:
diff changeset
351 gen_rtx_REG ((MODE), \
kono
parents:
diff changeset
352 FUNC_RETURN_REGNUM)
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 /* Order of allocation of registers. */
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 #define REG_ALLOC_ORDER \
kono
parents:
diff changeset
357 { 8, 9, 10, 11, 12, 13, 14, 15, \
kono
parents:
diff changeset
358 16, 17, 18, 19, 20, 21, 22, 23, \
kono
parents:
diff changeset
359 0, 1, 6, 7, 2, 3, 4, 5, \
kono
parents:
diff changeset
360 24, 25, 26, 27, 28, 29, 30, 31, \
kono
parents:
diff changeset
361 32, 33, 34 \
kono
parents:
diff changeset
362 }
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 #define REGNO_IN_RANGE(REGNO, MIN, MAX) \
kono
parents:
diff changeset
365 (IN_RANGE ((REGNO), (MIN), (MAX)) \
kono
parents:
diff changeset
366 || (reg_renumber != NULL \
kono
parents:
diff changeset
367 && reg_renumber[(REGNO)] >= (MIN) \
kono
parents:
diff changeset
368 && reg_renumber[(REGNO)] <= (MAX)))
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 #ifdef REG_OK_STRICT
kono
parents:
diff changeset
371 #define REGNO_OK_FOR_BASE_P(regno) REGNO_IN_RANGE (regno, 16, 31)
kono
parents:
diff changeset
372 #else
kono
parents:
diff changeset
373 #define REGNO_OK_FOR_BASE_P(regno) 1
kono
parents:
diff changeset
374 #endif
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 #define REGNO_OK_FOR_INDEX_P(regno) REGNO_OK_FOR_BASE_P (regno)
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 #define REGNO_MODE_CODE_OK_FOR_BASE_P(regno, mode, address_space, outer_code, index_code) \
kono
parents:
diff changeset
379 rl78_regno_mode_code_ok_for_base_p (regno, mode, address_space, outer_code, index_code)
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 #define MODE_CODE_BASE_REG_CLASS(mode, address_space, outer_code, index_code) \
kono
parents:
diff changeset
382 rl78_mode_code_base_reg_class (mode, address_space, outer_code, index_code)
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 #define RETURN_ADDR_RTX(COUNT, FRAMEADDR) \
kono
parents:
diff changeset
385 ((COUNT) == 0 \
kono
parents:
diff changeset
386 ? gen_rtx_MEM (Pmode, gen_rtx_PLUS (HImode, arg_pointer_rtx, GEN_INT (-4))) \
kono
parents:
diff changeset
387 : NULL_RTX)
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 #define INCOMING_RETURN_ADDR_RTX gen_rtx_MEM (Pmode, stack_pointer_rtx)
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 #define ACCUMULATE_OUTGOING_ARGS 1
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 typedef unsigned int CUMULATIVE_ARGS;
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
kono
parents:
diff changeset
396 (CUM) = 0
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 /* FIXME */
kono
parents:
diff changeset
400 #define NO_PROFILE_COUNTERS 1
kono
parents:
diff changeset
401 #define PROFILE_BEFORE_PROLOGUE 1
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 #define FUNCTION_PROFILER(FILE, LABELNO) \
kono
parents:
diff changeset
404 fprintf (FILE, "\tbsr\t__mcount\n");
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 #define TEXT_SECTION_ASM_OP ".text"
kono
parents:
diff changeset
408 #define DATA_SECTION_ASM_OP ".data"
kono
parents:
diff changeset
409 #define BSS_SECTION_ASM_OP ".bss"
kono
parents:
diff changeset
410 #define CTORS_SECTION_ASM_OP ".section \".ctors\",\"a\""
kono
parents:
diff changeset
411 #define DTORS_SECTION_ASM_OP ".section \".dtors\",\"a\""
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 #define ASM_COMMENT_START " ;"
kono
parents:
diff changeset
414 #define ASM_APP_ON ""
kono
parents:
diff changeset
415 #define ASM_APP_OFF ""
kono
parents:
diff changeset
416 #define LOCAL_LABEL_PREFIX ".L"
kono
parents:
diff changeset
417 #undef USER_LABEL_PREFIX
kono
parents:
diff changeset
418 #define USER_LABEL_PREFIX "_"
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 #define GLOBAL_ASM_OP "\t.global\t"
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
kono
parents:
diff changeset
423 fprintf (FILE, "\t.long .L%d\n", VALUE)
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 /* This is how to output an element of a case-vector that is relative.
kono
parents:
diff changeset
426 Note: The local label referenced by the "3b" below is emitted by
kono
parents:
diff changeset
427 the tablejump insn. */
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
kono
parents:
diff changeset
430 fprintf (FILE, "\t.long .L%d - 1b\n", VALUE)
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 #define ASM_OUTPUT_SYMBOL_REF(FILE, SYM) rl78_output_symbol_ref ((FILE), (SYM))
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 #define ASM_OUTPUT_LABELREF(FILE, SYM) rl78_output_labelref ((FILE), (SYM))
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 #define ASM_OUTPUT_ALIGNED_DECL_COMMON(STREAM, DECL, NAME, SIZE, ALIGNMENT) \
kono
parents:
diff changeset
438 rl78_output_aligned_common (STREAM, DECL, NAME, SIZE, ALIGNMENT, 1)
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGNMENT) \
kono
parents:
diff changeset
441 rl78_output_aligned_common (STREAM, DECL, NAME, SIZE, ALIGNMENT, 0)
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 #define ASM_OUTPUT_ALIGN(STREAM, LOG) \
kono
parents:
diff changeset
444 do \
kono
parents:
diff changeset
445 { \
kono
parents:
diff changeset
446 if ((LOG) == 0) \
kono
parents:
diff changeset
447 break; \
kono
parents:
diff changeset
448 fprintf (STREAM, "\t.balign %d\n", 1 << (LOG)); \
kono
parents:
diff changeset
449 } \
kono
parents:
diff changeset
450 while (0)
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 /* For PIC put jump tables into the text section so that the offsets that
kono
parents:
diff changeset
453 they contain are always computed between two same-section symbols. */
kono
parents:
diff changeset
454 #define JUMP_TABLES_IN_TEXT_SECTION (flag_pic)
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 /* This is a version of REG_P that also returns TRUE for SUBREGs. */
kono
parents:
diff changeset
457 #define RL78_REG_P(rtl) (REG_P (rtl) || GET_CODE (rtl) == SUBREG)
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 /* Like REG_P except that this macro is true for SET expressions. */
kono
parents:
diff changeset
460 #define SET_P(rtl) (GET_CODE (rtl) == SET)
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 #undef PREFERRED_DEBUGGING_TYPE
kono
parents:
diff changeset
463 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 #undef DWARF2_ADDR_SIZE
kono
parents:
diff changeset
466 #define DWARF2_ADDR_SIZE 4
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 #define DWARF2_ASM_LINE_DEBUG_INFO 1
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 #define EXIT_IGNORE_STACK 0
kono
parents:
diff changeset
471 #define INCOMING_FRAME_SP_OFFSET 4
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 #define BRANCH_COST(SPEED,PREDICT) 1
kono
parents:
diff changeset
475 #define REGISTER_MOVE_COST(MODE,FROM,TO) 2
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 #define EH_RETURN_DATA_REGNO(N) (N < 2 ? (8+(N)*2) : INVALID_REGNUM)
kono
parents:
diff changeset
478 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (HImode, 20)
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) DW_EH_PE_udata4
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 /* NOTE: defined but zero means dwarf2 debugging, but sjlj EH. */
kono
parents:
diff changeset
483 #define DWARF2_UNWIND_INFO 0
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 #define REGISTER_TARGET_PRAGMAS() rl78_register_pragmas()