]>
Commit | Line | Data |
---|---|---|
0b85d816 | 1 | /* Definitions for GCC. Part of the machine description for CRIS. |
cbe34bb5 | 2 | Copyright (C) 1998-2017 Free Software Foundation, Inc. |
0b85d816 HPN |
3 | Contributed by Axis Communications. Written by Hans-Peter Nilsson. |
4 | ||
5 | This file is part of GCC. | |
6 | ||
7 | GCC is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
2f83c7d6 | 9 | the Free Software Foundation; either version 3, or (at your option) |
0b85d816 HPN |
10 | any later version. |
11 | ||
12 | GCC is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
2f83c7d6 NC |
18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ | |
0b85d816 HPN |
20 | |
21 | /* After the first "Node:" comment comes all preprocessor directives and | |
22 | attached declarations described in the info files, the "Using and | |
23 | Porting GCC" manual (uapgcc), in the same order as found in the "Target | |
24 | macros" section in the gcc-2.9x CVS edition of 2000-03-17. FIXME: Not | |
25 | really, but needs an update anyway. | |
26 | ||
27 | There is no generic copy-of-uapgcc comment, you'll have to see uapgcc | |
28 | for that. If applicable, there is a CRIS-specific comment. The order | |
29 | of macro definitions follow the order in the manual. Every section in | |
30 | the manual (node in the info pages) has an introductory `Node: | |
31 | <subchapter>' comment. If no macros are defined for a section, only | |
32 | the section-comment is present. */ | |
33 | ||
34 | /* Note that other header files (e.g. config/elfos.h, config/linux.h, | |
0df965d7 SB |
35 | and config/cris/linux.h) are responsible for lots of settings not |
36 | repeated below. This file contains general CRIS definitions | |
37 | and definitions for the cris-*-elf subtarget. */ | |
0b85d816 | 38 | |
b6c34129 HPN |
39 | /* We don't want to use gcc_assert for everything, as that can be |
40 | compiled out. */ | |
41 | #define CRIS_ASSERT(x) \ | |
42 | do { if (!(x)) internal_error ("CRIS-port assertion failed: " #x); } while (0) | |
43 | ||
0b85d816 HPN |
44 | /* Replacement for REG_P since it does not match SUBREGs. Happens for |
45 | testcase Axis-20000320 with gcc-2.9x. */ | |
46 | #define REG_S_P(x) \ | |
47 | (REG_P (x) || (GET_CODE (x) == SUBREG && REG_P (XEXP (x, 0)))) | |
48 | ||
49 | /* Last register in main register bank r0..r15. */ | |
50 | #define CRIS_LAST_GENERAL_REGISTER 15 | |
51 | ||
52 | /* Descriptions of registers used for arguments. */ | |
53 | #define CRIS_FIRST_ARG_REG 10 | |
54 | #define CRIS_MAX_ARGS_IN_REGS 4 | |
55 | ||
f60c7155 | 56 | /* See also *_REGNUM constants in cris.md. */ |
0b85d816 HPN |
57 | |
58 | /* Most of the time, we need the index into the register-names array. | |
f60c7155 | 59 | When passing debug-info, we need the real hardware register number. */ |
0b85d816 HPN |
60 | #define CRIS_CANONICAL_SRP_REGNUM (16 + 11) |
61 | #define CRIS_CANONICAL_MOF_REGNUM (16 + 7) | |
f9968e3e HPN |
62 | /* We have CCR in all models including v10, but that's 16 bits, so let's |
63 | prefer the DCCR number, which is a DMA pointer in pre-v8, so we'll | |
64 | never clash with it for GCC purposes. */ | |
65 | #define CRIS_CANONICAL_CC0_REGNUM (16 + 13) | |
0b85d816 HPN |
66 | |
67 | /* When generating PIC, these suffixes are added to the names of non-local | |
68 | functions when being output. Contrary to other ports, we have offsets | |
69 | relative to the GOT, not the PC. We might implement PC-relative PLT | |
70 | semantics later for the general case; they are used in some cases right | |
71 | now, such as MI thunks. */ | |
72 | #define CRIS_GOTPLT_SUFFIX ":GOTPLT" | |
73 | #define CRIS_PLT_GOTOFFSET_SUFFIX ":PLTG" | |
74 | #define CRIS_PLT_PCOFFSET_SUFFIX ":PLT" | |
75 | ||
76 | #define CRIS_FUNCTION_ARG_SIZE(MODE, TYPE) \ | |
77 | ((MODE) != BLKmode ? GET_MODE_SIZE (MODE) \ | |
78 | : (unsigned) int_size_in_bytes (TYPE)) | |
79 | ||
0b85d816 HPN |
80 | /* Which CPU version this is. The parsed and adjusted cris_cpu_str. */ |
81 | extern int cris_cpu_version; | |
82 | ||
0b85d816 HPN |
83 | |
84 | /* Node: Driver */ | |
85 | ||
0df965d7 | 86 | /* Also provide canonical vN definitions when user specifies an alias. */ |
0b85d816 | 87 | |
0b85d816 | 88 | #define CPP_SPEC \ |
c555b47f | 89 | "%{mtune=*:-D__tune_%* %{mtune=v*:-D__CRIS_arch_tune=%*}\ |
0b85d816 HPN |
90 | %{mtune=etrax4:-D__tune_v3 -D__CRIS_arch_tune=3}\ |
91 | %{mtune=etrax100:-D__tune_v8 -D__CRIS_arch_tune=8}\ | |
92 | %{mtune=svinto:-D__tune_v8 -D__CRIS_arch_tune=8}\ | |
93 | %{mtune=etrax100lx:-D__tune_v10 -D__CRIS_arch_tune=10}\ | |
c555b47f HPN |
94 | %{mtune=ng:-D__tune_v10 -D__CRIS_arch_tune=10}}\ |
95 | %{mcpu=*:-D__arch_%* %{mcpu=v*:-D__CRIS_arch_version=%*}\ | |
0b85d816 HPN |
96 | %{mcpu=etrax4:-D__arch_v3 -D__CRIS_arch_version=3}\ |
97 | %{mcpu=etrax100:-D__arch_v8 -D__CRIS_arch_version=8}\ | |
98 | %{mcpu=svinto:-D__arch_v8 -D__CRIS_arch_version=8}\ | |
99 | %{mcpu=etrax100lx:-D__arch_v10 -D__CRIS_arch_version=10}\ | |
c555b47f HPN |
100 | %{mcpu=ng:-D__arch_v10 -D__CRIS_arch_version=10}}\ |
101 | %{march=*:-D__arch_%* %{march=v*:-D__CRIS_arch_version=%*}\ | |
0b85d816 HPN |
102 | %{march=etrax4:-D__arch_v3 -D__CRIS_arch_version=3}\ |
103 | %{march=etrax100:-D__arch_v8 -D__CRIS_arch_version=8}\ | |
104 | %{march=svinto:-D__arch_v8 -D__CRIS_arch_version=8}\ | |
105 | %{march=etrax100lx:-D__arch_v10 -D__CRIS_arch_version=10}\ | |
c555b47f | 106 | %{march=ng:-D__arch_v10 -D__CRIS_arch_version=10}}\ |
0b85d816 HPN |
107 | %{metrax100:-D__arch__v8 -D__CRIS_arch_version=8}\ |
108 | %{metrax4:-D__arch__v3 -D__CRIS_arch_version=3}\ | |
109 | %(cpp_subtarget)" | |
110 | ||
111 | /* For the cris-*-elf subtarget. */ | |
6725c402 HPN |
112 | |
113 | #define CRIS_DEFAULT_TUNE "10" | |
114 | #define CRIS_ARCH_CPP_DEFAULT | |
115 | #define CRIS_DEFAULT_ASM_ARCH_OPTION "" | |
116 | ||
117 | #ifdef TARGET_CPU_DEFAULT | |
118 | #if TARGET_CPU_DEFAULT != 32 && TARGET_CPU_DEFAULT != 10 | |
119 | #error "Due to '()'; e.g. '#define TARGET_CPU_DEFAULT (10)', stringize TARGET_CPU_DEFAULT isn't useful: update manually." | |
120 | #endif | |
121 | ||
122 | #if TARGET_CPU_DEFAULT == 32 | |
123 | #undef CRIS_DEFAULT_TUNE | |
124 | #define CRIS_DEFAULT_TUNE "32" | |
125 | /* To enable use of "generic" cris-axis-elf binutils, always pass the | |
126 | architecture option to GAS. (We don't do this for non-v32.) */ | |
127 | #undef CRIS_DEFAULT_ASM_ARCH_OPTION | |
128 | #define CRIS_DEFAULT_ASM_ARCH_OPTION "--march=v32" | |
129 | #endif | |
130 | ||
131 | #undef CRIS_ARCH_CPP_DEFAULT | |
132 | #define CRIS_ARCH_CPP_DEFAULT \ | |
133 | "%{!march=*:\ | |
134 | %{!metrax*:\ | |
135 | %{!mcpu=*:\ | |
136 | %{!mtune=*:-D__tune_v" CRIS_DEFAULT_TUNE "}\ | |
60b92097 | 137 | -D__arch_v" CRIS_DEFAULT_TUNE \ |
6725c402 HPN |
138 | " -D__CRIS_arch_version=" CRIS_DEFAULT_TUNE "}}}" |
139 | #endif | |
140 | ||
0b85d816 | 141 | #define CRIS_CPP_SUBTARGET_SPEC \ |
a6e464ae | 142 | "%{mbest-lib-options:\ |
0b85d816 | 143 | %{!moverride-best-lib-options:\ |
6725c402 HPN |
144 | %{!march=*:%{!metrax*:%{!mcpu=*:\ |
145 | -D__tune_v" CRIS_DEFAULT_TUNE \ | |
146 | " -D__CRIS_arch_tune=" CRIS_DEFAULT_TUNE "}}}}}"\ | |
147 | CRIS_ARCH_CPP_DEFAULT | |
0b85d816 | 148 | |
e8baa9bc | 149 | /* Override previous definitions (../linux.h). */ |
0b85d816 HPN |
150 | #undef CC1_SPEC |
151 | #define CC1_SPEC \ | |
baf3ead6 | 152 | "%{metrax4:-march=v3}\ |
0b85d816 | 153 | %{metrax100:-march=v8}\ |
e8baa9bc HPN |
154 | %{march=*:-march=%*}\ |
155 | %{mcpu=*:-mcpu=%*}\ | |
0b85d816 HPN |
156 | %(cc1_subtarget)" |
157 | ||
158 | /* For the cris-*-elf subtarget. */ | |
159 | #define CRIS_CC1_SUBTARGET_SPEC \ | |
160 | "-melf\ | |
161 | %{mbest-lib-options:\ | |
162 | %{!moverride-best-lib-options:\ | |
6725c402 HPN |
163 | %{!march=*:%{!mcpu=*:-mtune=v" CRIS_DEFAULT_TUNE\ |
164 | " -D__CRIS_arch_tune=" CRIS_DEFAULT_TUNE "}}\ | |
0b85d816 HPN |
165 | %{!finhibit-size-directive:\ |
166 | %{!fno-function-sections: -ffunction-sections}\ | |
167 | %{!fno-data-sections: -fdata-sections}}}}" | |
168 | ||
6c660aeb | 169 | /* This adds to CC1_SPEC. */ |
0b85d816 HPN |
170 | #define CC1PLUS_SPEC "" |
171 | ||
43537bf6 | 172 | #ifdef HAVE_AS_NO_MUL_BUG_ABORT_OPTION |
86da66b5 HPN |
173 | #define MAYBE_AS_NO_MUL_BUG_ABORT \ |
174 | "%{mno-mul-bug-workaround:-no-mul-bug-abort} " | |
175 | #else | |
176 | #define MAYBE_AS_NO_MUL_BUG_ABORT | |
177 | #endif | |
178 | ||
ef0cd8fe | 179 | /* Override previous definitions (../linux.h). */ |
0b85d816 HPN |
180 | #undef ASM_SPEC |
181 | #define ASM_SPEC \ | |
86da66b5 | 182 | MAYBE_AS_NO_MUL_BUG_ABORT \ |
78a14252 | 183 | "%(asm_subtarget)\ |
a3010a69 | 184 | %{march=*:%{mcpu=*:%edo not specify both -march=... and -mcpu=...}}\ |
e8baa9bc HPN |
185 | %{march=v0|mcpu=v0|march=v3|mcpu=v3|march=v8|mcpu=v8:--march=v0_v10}\ |
186 | %{march=v10|mcpu=v10:--march=v10}\ | |
187 | %{march=v32|mcpu=v32:--march=v32}" | |
0b85d816 HPN |
188 | |
189 | /* For the cris-*-elf subtarget. */ | |
6725c402 | 190 | #define CRIS_ASM_SUBTARGET_SPEC \ |
a3010a69 | 191 | "--em=criself %{!march=*:%{!mcpu=*:" CRIS_DEFAULT_ASM_ARCH_OPTION "}}" |
0b85d816 HPN |
192 | |
193 | /* FIXME: We should propagate the -melf option to make the criself | |
194 | "emulation" unless a linker script is provided (-T*), but I don't know | |
195 | how to do that if either of -Ttext, -Tdata or -Tbss is given but no | |
196 | linker script, as is usually the case. Leave it to the user for the | |
0df965d7 | 197 | time being. */ |
0b85d816 HPN |
198 | #undef LINK_SPEC |
199 | #define LINK_SPEC \ | |
200 | "%{v:--verbose}\ | |
d3295e25 | 201 | %(link_subtarget)" |
0b85d816 HPN |
202 | |
203 | /* For the cris-*-elf subtarget. */ | |
204 | #define CRIS_LINK_SUBTARGET_SPEC \ | |
205 | "-mcriself\ | |
206 | %{sim2:%{!T*:-Tdata 0x4000000 -Tbss 0x8000000}}\ | |
349ccf2e | 207 | %{!r:%{O2|O3: --gc-sections}}" |
0b85d816 | 208 | |
fe04ce06 HPN |
209 | /* Which library to get. The simulator uses a different library for |
210 | the low-level syscalls (implementing the Linux syscall ABI instead | |
211 | of direct-iron accesses). Default everything with the stub "nosys" | |
212 | library. */ | |
0b85d816 HPN |
213 | /* Override previous definitions (linux.h). */ |
214 | #undef LIB_SPEC | |
215 | #define LIB_SPEC \ | |
fe04ce06 | 216 | "%{sim*:--start-group -lc -lsyslinux --end-group}\ |
0b85d816 HPN |
217 | %{!sim*:%{g*:-lg}\ |
218 | %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p} -lbsp}\ | |
219 | -lnosys" | |
220 | ||
221 | /* Linker startfile options; crt0 flavors. | |
fe04ce06 | 222 | We need to remove any previous definition (elfos.h). */ |
e16b32fc | 223 | #undef STARTFILE_SPEC |
0b85d816 | 224 | #define STARTFILE_SPEC \ |
fe04ce06 HPN |
225 | "%{sim*:crt1.o%s}%{!sim*:crt0.o%s}\ |
226 | crti.o%s crtbegin.o%s" | |
0b85d816 | 227 | |
e16b32fc | 228 | #undef ENDFILE_SPEC |
fe04ce06 | 229 | #define ENDFILE_SPEC "crtend.o%s crtn.o%s" |
aa97fdf3 | 230 | |
0b85d816 HPN |
231 | #define EXTRA_SPECS \ |
232 | {"cpp_subtarget", CRIS_CPP_SUBTARGET_SPEC}, \ | |
233 | {"cc1_subtarget", CRIS_CC1_SUBTARGET_SPEC}, \ | |
234 | {"asm_subtarget", CRIS_ASM_SUBTARGET_SPEC}, \ | |
235 | {"link_subtarget", CRIS_LINK_SUBTARGET_SPEC}, \ | |
236 | CRIS_SUBTARGET_EXTRA_SPECS | |
237 | ||
238 | #define CRIS_SUBTARGET_EXTRA_SPECS | |
239 | ||
240 | ||
241 | /* Node: Run-time Target */ | |
242 | ||
a6e464ae HPN |
243 | #define TARGET_CPU_CPP_BUILTINS() \ |
244 | do \ | |
245 | { \ | |
246 | builtin_define_std ("cris"); \ | |
247 | builtin_define_std ("CRIS"); \ | |
248 | builtin_define_std ("GNU_CRIS"); \ | |
249 | builtin_define ("__CRIS_ABI_version=2"); \ | |
26b0ad13 KG |
250 | builtin_assert ("cpu=cris"); \ |
251 | builtin_assert ("machine=cris"); \ | |
a6e464ae HPN |
252 | } \ |
253 | while (0) | |
254 | ||
2a186d97 HPN |
255 | /* Previously controlled by target_flags. Note that this is *not* set |
256 | for -melinux. */ | |
257 | #define TARGET_LINUX 0 | |
0b85d816 | 258 | |
0b85d816 | 259 | /* For the cris-*-elf subtarget. */ |
2a186d97 | 260 | #define CRIS_SUBTARGET_DEFAULT 0 |
0b85d816 HPN |
261 | |
262 | #define CRIS_CPU_BASE 0 | |
263 | #define CRIS_CPU_ETRAX4 3 /* Just lz added. */ | |
264 | #define CRIS_CPU_SVINTO 8 /* Added swap, jsrc & Co., 32-bit accesses. */ | |
265 | #define CRIS_CPU_NG 10 /* Added mul[su]. */ | |
6725c402 HPN |
266 | #define CRIS_CPU_V32 32 /* Major changes. */ |
267 | ||
268 | #ifndef TARGET_CPU_DEFAULT | |
269 | #define TARGET_CPU_DEFAULT CRIS_CPU_BASE | |
270 | #endif | |
271 | ||
21ed4444 HPN |
272 | /* Default target_flags if no switches specified. |
273 | The alignment-by-32 is to make builtin atomic support for v10 and v32 | |
274 | work for *-elf for types without specified alignment (like plain | |
275 | "int"). See top comment in sync.md. */ | |
6725c402 HPN |
276 | #ifndef TARGET_DEFAULT |
277 | # if TARGET_CPU_DEFAULT == 32 | |
278 | # define TARGET_DEFAULT \ | |
279 | (MASK_STACK_ALIGN \ | |
280 | + MASK_CONST_ALIGN + MASK_DATA_ALIGN \ | |
21ed4444 | 281 | + MASK_ALIGN_BY_32 \ |
6725c402 | 282 | + MASK_PROLOGUE_EPILOGUE) |
21ed4444 HPN |
283 | # elif TARGET_CPU_DEFAULT == 10 |
284 | # define TARGET_DEFAULT \ | |
285 | (MASK_SIDE_EFFECT_PREFIXES + MASK_STACK_ALIGN \ | |
286 | + MASK_CONST_ALIGN + MASK_DATA_ALIGN \ | |
287 | + MASK_ALIGN_BY_32 \ | |
288 | + MASK_PROLOGUE_EPILOGUE + MASK_MUL_BUG) | |
289 | # else /* 0 */ | |
290 | # define TARGET_DEFAULT \ | |
6725c402 HPN |
291 | (MASK_SIDE_EFFECT_PREFIXES + MASK_STACK_ALIGN \ |
292 | + MASK_CONST_ALIGN + MASK_DATA_ALIGN \ | |
293 | + MASK_PROLOGUE_EPILOGUE + MASK_MUL_BUG) | |
294 | # endif | |
295 | #endif | |
0b85d816 HPN |
296 | |
297 | /* Local, providing a default for cris_cpu_version. */ | |
6725c402 | 298 | #define CRIS_DEFAULT_CPU_VERSION TARGET_CPU_DEFAULT |
0b85d816 HPN |
299 | |
300 | #define TARGET_HAS_MUL_INSNS (cris_cpu_version >= CRIS_CPU_NG) | |
e636e508 | 301 | #define TARGET_HAS_LZ (cris_cpu_version >= CRIS_CPU_ETRAX4) |
64f5af47 | 302 | #define TARGET_HAS_BREAK (cris_cpu_version >= CRIS_CPU_ETRAX4) |
df638b27 | 303 | #define TARGET_HAS_SWAP (cris_cpu_version >= CRIS_CPU_SVINTO) |
6725c402 | 304 | #define TARGET_V32 (cris_cpu_version >= CRIS_CPU_V32) |
0b85d816 | 305 | |
64f5af47 HPN |
306 | /* The "break" instruction was introduced with ETRAX 4. */ |
307 | #define TARGET_TRAP_USING_BREAK8 \ | |
308 | (cris_trap_using_break8 == 2 ? TARGET_HAS_BREAK : cris_trap_using_break8) | |
309 | ||
dec4306f HPN |
310 | /* Call library functions by default for GNU/Linux. */ |
311 | #define TARGET_ATOMICS_MAY_CALL_LIBFUNCS \ | |
312 | (cris_atomics_calling_libfunc == 2 \ | |
313 | ? TARGET_LINUX : cris_atomics_calling_libfunc) | |
314 | ||
21ed4444 HPN |
315 | /* The < v10 atomics turn off interrupts, so they don't need alignment. |
316 | Incidentally, by default alignment is off there causing variables to | |
317 | be default unaligned all over, so we'd have to make support | |
318 | libraries use a proper atomic type (instead of "int"), one we'd | |
319 | specify as aligned. */ | |
320 | #define TARGET_TRAP_UNALIGNED_ATOMIC \ | |
321 | (cris_trap_unaligned_atomic == 2 \ | |
322 | ? (TARGET_V32 || cris_cpu_version == 10) \ | |
323 | : cris_trap_unaligned_atomic) | |
324 | ||
0b85d816 HPN |
325 | /* Node: Storage Layout */ |
326 | ||
327 | #define BITS_BIG_ENDIAN 0 | |
328 | ||
329 | #define BYTES_BIG_ENDIAN 0 | |
330 | ||
331 | /* WORDS_BIG_ENDIAN is not defined in the hardware, but for consistency, | |
332 | we use little-endianness, and we may also be able to use | |
333 | post-increment on DImode indirect. */ | |
334 | #define WORDS_BIG_ENDIAN 0 | |
335 | ||
0b85d816 HPN |
336 | #define UNITS_PER_WORD 4 |
337 | ||
0b85d816 HPN |
338 | #define CRIS_PROMOTED_MODE(MODE, UNSIGNEDP, TYPE) \ |
339 | (GET_MODE_CLASS (MODE) == MODE_INT && GET_MODE_SIZE (MODE) < 4) \ | |
340 | ? SImode : MODE | |
341 | ||
0b85d816 HPN |
342 | /* We will be using prototype promotion, so they will be 32 bit. */ |
343 | #define PARM_BOUNDARY 32 | |
344 | ||
345 | /* Stack boundary is guided by -mstack-align, -mno-stack-align, | |
346 | -malign. | |
347 | Old comment: (2.1: still valid in 2.7.2?) | |
348 | Note that to make this macro affect the alignment of stack | |
349 | locals, a fix was required, and special precautions when handling | |
41441dc7 NB |
350 | the stack pointer in various other macros (TARGET_ASM_FUNCTION_PROLOGUE |
351 | et al) were required. See file "function.c". If you would just define | |
0b85d816 HPN |
352 | this macro, it would only affect the builtin alloca and variable |
353 | local data (non-ANSI, non-K&R, Gnu C extension). */ | |
354 | #define STACK_BOUNDARY \ | |
355 | (TARGET_STACK_ALIGN ? (TARGET_ALIGN_BY_32 ? 32 : 16) : 8) | |
356 | ||
357 | #define FUNCTION_BOUNDARY 16 | |
358 | ||
359 | /* Do not change BIGGEST_ALIGNMENT (when optimizing), as it will affect | |
e5837c07 | 360 | strange places, at least in 2.1. */ |
0b85d816 HPN |
361 | #define BIGGEST_ALIGNMENT 8 |
362 | ||
363 | /* If -m16bit, -m16-bit, -malign or -mdata-align, | |
e5837c07 | 364 | align everything to 16 bit. */ |
0b85d816 HPN |
365 | #define DATA_ALIGNMENT(TYPE, BASIC_ALIGN) \ |
366 | (TARGET_DATA_ALIGN \ | |
367 | ? (TARGET_ALIGN_BY_32 \ | |
368 | ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN) \ | |
369 | : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN) | |
370 | ||
371 | /* Note that CONSTANT_ALIGNMENT has the effect of making gcc believe that | |
372 | ALL references to constant stuff (in code segment, like strings) has | |
373 | this alignment. That is a rather rushed assumption. Luckily we do not | |
374 | care about the "alignment" operand to builtin memcpy (only place where | |
375 | it counts), so it doesn't affect any bad spots. */ | |
376 | #define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN) \ | |
377 | (TARGET_CONST_ALIGN \ | |
378 | ? (TARGET_ALIGN_BY_32 \ | |
379 | ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN) \ | |
380 | : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN) | |
381 | ||
382 | /* FIXME: Define LOCAL_ALIGNMENT for word and dword or arrays and | |
383 | structures (if -mstack-align=), and check that it is good. */ | |
384 | ||
385 | #define EMPTY_FIELD_BOUNDARY 8 | |
386 | ||
387 | #define STRUCTURE_SIZE_BOUNDARY 8 | |
388 | ||
389 | #define STRICT_ALIGNMENT 0 | |
390 | ||
391 | /* Remove any previous definition (elfos.h). | |
392 | ??? If it wasn't for all the other stuff that affects layout of | |
393 | structures and bit-fields, this could presumably cause incompatibility | |
394 | with other GNU/Linux ports (i.e. elfos.h users). */ | |
395 | #undef PCC_BITFIELD_TYPE_MATTERS | |
396 | ||
397 | /* This is only used for non-scalars. Strange stuff happens to structs | |
398 | (FIXME: What?) if we use anything larger than largest actually used | |
399 | datum size, so lets make it 32. The type "long long" will still work | |
400 | as usual. We can still have DImode insns, but they will only be used | |
401 | for scalar data (i.e. long long). */ | |
402 | #define MAX_FIXED_MODE_SIZE 32 | |
403 | ||
404 | ||
405 | /* Node: Type Layout */ | |
406 | ||
407 | /* Note that DOUBLE_TYPE_SIZE is not defined anymore, since the default | |
408 | value gives a 64-bit double, which is what we now use. */ | |
409 | ||
410 | /* For compatibility and historical reasons, a char should be signed. */ | |
411 | #define DEFAULT_SIGNED_CHAR 1 | |
412 | ||
0b85d816 HPN |
413 | /* Note that WCHAR_TYPE_SIZE is used in cexp.y, |
414 | where TARGET_SHORT is not available. */ | |
415 | #undef WCHAR_TYPE | |
416 | #define WCHAR_TYPE "long int" | |
417 | ||
418 | #undef WCHAR_TYPE_SIZE | |
419 | #define WCHAR_TYPE_SIZE 32 | |
420 | ||
421 | ||
422 | /* Node: Register Basics */ | |
423 | ||
f60c7155 | 424 | /* We count all 16 non-special registers, SRP, a faked argument |
f9968e3e HPN |
425 | pointer register, MOF and CCR/DCCR. */ |
426 | #define FIRST_PSEUDO_REGISTER (16 + 1 + 1 + 1 + 1) | |
0b85d816 HPN |
427 | |
428 | /* For CRIS, these are r15 (pc) and r14 (sp). Register r8 is used as a | |
429 | frame-pointer, but is not fixed. SRP is not included in general | |
430 | registers and will not be used automatically. All other special | |
431 | registers are fixed at the moment. The faked argument pointer register | |
432 | is fixed too. */ | |
433 | #define FIXED_REGISTERS \ | |
2ea91d6b | 434 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1} |
0b85d816 HPN |
435 | |
436 | /* Register r9 is used for structure-address, r10-r13 for parameters, | |
437 | r10- for return values. */ | |
438 | #define CALL_USED_REGISTERS \ | |
f9968e3e | 439 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1} |
0b85d816 | 440 | |
0b85d816 HPN |
441 | /* Node: Allocation Order */ |
442 | ||
443 | /* We need this on CRIS, because call-used regs should be used first, | |
f710504c | 444 | (so we don't need to push). Else start using registers from r0 and up. |
0b85d816 HPN |
445 | This preference is mainly because if we put call-used-regs from r0 |
446 | and up, then we can't use movem to push the rest, (which have to be | |
447 | saved if we use them, and movem has to start with r0). | |
448 | Change here if you change which registers to use as call registers. | |
449 | ||
450 | The actual need to explicitly prefer call-used registers improved the | |
451 | situation a lot for 2.1, but might not actually be needed anymore. | |
452 | Still, this order reflects what GCC should find out by itself, so it | |
453 | probably does not hurt. | |
454 | ||
455 | Order of preference: Call-used-regs first, then r0 and up, last fp & | |
456 | sp & pc as fillers. | |
457 | Call-used regs in opposite order, so they will cause less conflict if | |
458 | a function has few args (<= 3) and it wants a scratch reg. | |
459 | Use struct-return address first, since very few functions use | |
460 | structure return values so it is likely to be available. */ | |
461 | #define REG_ALLOC_ORDER \ | |
f9968e3e | 462 | {9, 13, 12, 11, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 14, 15, 17, 16, 18, 19} |
0b85d816 | 463 | |
6725c402 HPN |
464 | /* Use MOF and ACR. Prefer ACR before any other register. Prefer MOF |
465 | then SRP after saved registers. The *after* is because they're only | |
466 | useful for storage, not for things being computed, which is | |
467 | apparently more common. */ | |
468 | #define REG_ALLOC_ORDER_V32 \ | |
469 | {15, 9, 13, 12, 11, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 17, 16, 14, 18, 19} | |
470 | ||
0b85d816 | 471 | |
0b85d816 HPN |
472 | /* Node: Leaf Functions */ |
473 | /* (no definitions) */ | |
474 | ||
475 | /* Node: Stack Registers */ | |
476 | /* (no definitions) */ | |
477 | ||
478 | ||
479 | /* Node: Register Classes */ | |
480 | ||
2ea91d6b | 481 | /* We need a separate register class to handle register allocation for |
6725c402 HPN |
482 | ACR, since it can't be used for post-increment. |
483 | ||
484 | It's not obvious, but having subunions of all movable-between | |
2ea91d6b HPN |
485 | register classes does really help register allocation (pre-IRA |
486 | comment). */ | |
6725c402 | 487 | enum reg_class |
f60c7155 HPN |
488 | { |
489 | NO_REGS, | |
2ea91d6b HPN |
490 | ACR_REGS, MOF_REGS, SRP_REGS, CC0_REGS, |
491 | MOF_SRP_REGS, SPECIAL_REGS, | |
6725c402 HPN |
492 | SPEC_ACR_REGS, GENNONACR_REGS, |
493 | SPEC_GENNONACR_REGS, GENERAL_REGS, | |
494 | ALL_REGS, | |
f60c7155 HPN |
495 | LIM_REG_CLASSES |
496 | }; | |
0b85d816 HPN |
497 | |
498 | #define N_REG_CLASSES (int) LIM_REG_CLASSES | |
499 | ||
6725c402 HPN |
500 | #define REG_CLASS_NAMES \ |
501 | {"NO_REGS", \ | |
2ea91d6b HPN |
502 | "ACR_REGS", "MOF_REGS", "SRP_REGS", "CC0_REGS", \ |
503 | "MOF_SRP_REGS", "SPECIAL_REGS", \ | |
6725c402 HPN |
504 | "SPEC_ACR_REGS", "GENNONACR_REGS", "SPEC_GENNONACR_REGS", \ |
505 | "GENERAL_REGS", "ALL_REGS"} | |
0b85d816 | 506 | |
f60c7155 | 507 | #define CRIS_SPECIAL_REGS_CONTENTS \ |
f9968e3e | 508 | ((1 << CRIS_SRP_REGNUM) | (1 << CRIS_MOF_REGNUM) | (1 << CRIS_CC0_REGNUM)) |
0b85d816 HPN |
509 | |
510 | /* Count in the faked argument register in GENERAL_REGS. Keep out SRP. */ | |
f60c7155 HPN |
511 | #define REG_CLASS_CONTENTS \ |
512 | { \ | |
513 | {0}, \ | |
6725c402 | 514 | {1 << CRIS_ACR_REGNUM}, \ |
f60c7155 | 515 | {1 << CRIS_MOF_REGNUM}, \ |
2ea91d6b | 516 | {1 << CRIS_SRP_REGNUM}, \ |
f9968e3e | 517 | {1 << CRIS_CC0_REGNUM}, \ |
2ea91d6b HPN |
518 | {(1 << CRIS_MOF_REGNUM) \ |
519 | | (1 << CRIS_SRP_REGNUM)}, \ | |
f60c7155 | 520 | {CRIS_SPECIAL_REGS_CONTENTS}, \ |
6725c402 HPN |
521 | {CRIS_SPECIAL_REGS_CONTENTS \ |
522 | | (1 << CRIS_ACR_REGNUM)}, \ | |
523 | {(0xffff | (1 << CRIS_AP_REGNUM)) \ | |
524 | & ~(1 << CRIS_ACR_REGNUM)}, \ | |
525 | {(0xffff | (1 << CRIS_AP_REGNUM) \ | |
526 | | CRIS_SPECIAL_REGS_CONTENTS) \ | |
527 | & ~(1 << CRIS_ACR_REGNUM)}, \ | |
f9968e3e HPN |
528 | {0xffff | (1 << CRIS_AP_REGNUM)}, \ |
529 | {0xffff | (1 << CRIS_AP_REGNUM) \ | |
530 | | CRIS_SPECIAL_REGS_CONTENTS} \ | |
f60c7155 HPN |
531 | } |
532 | ||
533 | #define REGNO_REG_CLASS(REGNO) \ | |
6725c402 HPN |
534 | ((REGNO) == CRIS_ACR_REGNUM ? ACR_REGS : \ |
535 | (REGNO) == CRIS_MOF_REGNUM ? MOF_REGS : \ | |
2ea91d6b | 536 | (REGNO) == CRIS_SRP_REGNUM ? SRP_REGS : \ |
f9968e3e | 537 | (REGNO) == CRIS_CC0_REGNUM ? CC0_REGS : \ |
f60c7155 | 538 | GENERAL_REGS) |
0b85d816 HPN |
539 | |
540 | #define BASE_REG_CLASS GENERAL_REGS | |
541 | ||
86fc3d06 | 542 | #define MODE_CODE_BASE_REG_CLASS(MODE, AS, OCODE, ICODE) \ |
6725c402 HPN |
543 | ((OCODE) != POST_INC ? BASE_REG_CLASS : GENNONACR_REGS) |
544 | ||
0b85d816 HPN |
545 | #define INDEX_REG_CLASS GENERAL_REGS |
546 | ||
0b85d816 | 547 | /* Since it uses reg_renumber, it is safe only once reg_renumber |
aeb9f7cf SB |
548 | has been allocated, which happens in reginfo.c during register |
549 | allocation. */ | |
0b85d816 HPN |
550 | #define REGNO_OK_FOR_BASE_P(REGNO) \ |
551 | ((REGNO) <= CRIS_LAST_GENERAL_REGISTER \ | |
552 | || (REGNO) == ARG_POINTER_REGNUM \ | |
553 | || (unsigned) reg_renumber[REGNO] <= CRIS_LAST_GENERAL_REGISTER \ | |
554 | || (unsigned) reg_renumber[REGNO] == ARG_POINTER_REGNUM) | |
555 | ||
6725c402 HPN |
556 | /* REGNO_OK_FOR_BASE_P seems to be obsolete wrt. this one, but not yet |
557 | documented as such. */ | |
86fc3d06 | 558 | #define REGNO_MODE_CODE_OK_FOR_BASE_P(REGNO, MODE, AS, OCODE, ICODE) \ |
6725c402 HPN |
559 | (REGNO_OK_FOR_BASE_P (REGNO) \ |
560 | && ((OCODE) != POST_INC \ | |
561 | || !((REGNO) == CRIS_ACR_REGNUM \ | |
562 | || (unsigned) reg_renumber[REGNO] == CRIS_ACR_REGNUM))) | |
563 | ||
0b85d816 HPN |
564 | /* See REGNO_OK_FOR_BASE_P. */ |
565 | #define REGNO_OK_FOR_INDEX_P(REGNO) REGNO_OK_FOR_BASE_P(REGNO) | |
566 | ||
f60c7155 | 567 | /* We can't move special registers to and from memory in smaller than |
83907fdd HPN |
568 | word_mode. We also can't move between special registers. Luckily, |
569 | -1, as returned by true_regnum for non-sub/registers, is valid as a | |
570 | parameter to our REGNO_REG_CLASS, returning GENERAL_REGS, so we get | |
571 | the effect that any X that isn't a special-register is treated as | |
572 | a non-empty intersection with GENERAL_REGS. */ | |
573 | #define SECONDARY_RELOAD_CLASS(CLASS, MODE, X) \ | |
2ea91d6b | 574 | ((reg_class_subset_p (CLASS, SPECIAL_REGS) \ |
83907fdd HPN |
575 | && ((GET_MODE_SIZE (MODE) < 4 && MEM_P (X)) \ |
576 | || !reg_classes_intersect_p (REGNO_REG_CLASS (true_regnum (X)), \ | |
577 | GENERAL_REGS))) \ | |
578 | ? GENERAL_REGS : NO_REGS) | |
0b85d816 | 579 | |
6725c402 HPN |
580 | /* FIXME: Fix regrename.c; it should check validity of replacements, |
581 | not just with a silly pass-specific macro. We may miss some | |
582 | opportunities, but we must stop regrename from creating acr++. */ | |
583 | #define HARD_REGNO_RENAME_OK(FROM, TO) ((TO) != CRIS_ACR_REGNUM) | |
584 | ||
0b85d816 HPN |
585 | /* For CRIS, this is always the size of MODE in words, |
586 | since all registers are the same size. To use omitted modes in | |
587 | patterns with reload constraints, you must say the widest size | |
588 | which is allowed for VOIDmode. | |
589 | FIXME: Does that still apply for gcc-2.9x? Keep poisoned until such | |
590 | patterns are added back. News: 2001-03-16: Happens as early as the | |
591 | underscore-test. */ | |
592 | #define CLASS_MAX_NREGS(CLASS, MODE) \ | |
593 | ((MODE) == VOIDmode \ | |
594 | ? 1 /* + cris_fatal ("CLASS_MAX_NREGS with VOIDmode") */ \ | |
595 | : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)) | |
596 | ||
0b85d816 HPN |
597 | |
598 | /* Node: Frame Layout */ | |
599 | ||
62f9f30b | 600 | #define STACK_GROWS_DOWNWARD 1 |
f62c8a5c | 601 | #define FRAME_GROWS_DOWNWARD 1 |
0b85d816 HPN |
602 | |
603 | /* It seems to be indicated in the code (at least 2.1) that this is | |
604 | better a constant, and best 0. */ | |
605 | #define STARTING_FRAME_OFFSET 0 | |
606 | ||
607 | #define FIRST_PARM_OFFSET(FNDECL) 0 | |
608 | ||
609 | #define RETURN_ADDR_RTX(COUNT, FRAMEADDR) \ | |
610 | cris_return_addr_rtx (COUNT, FRAMEADDR) | |
611 | ||
f1c25d3b | 612 | #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, CRIS_SRP_REGNUM) |
0b85d816 HPN |
613 | |
614 | /* FIXME: Any __builtin_eh_return callers must not return anything and | |
615 | there must not be collisions with incoming parameters. Luckily the | |
616 | number of __builtin_eh_return callers is limited. For now return | |
617 | parameter registers in reverse order and hope for the best. */ | |
618 | #define EH_RETURN_DATA_REGNO(N) \ | |
2b371d25 | 619 | (IN_RANGE ((N), 0, 3) ? (CRIS_FIRST_ARG_REG + 3 - (N)) : INVALID_REGNUM) |
0b85d816 HPN |
620 | |
621 | /* Store the stack adjustment in the structure-return-address register. */ | |
a2fef3a4 | 622 | #define CRIS_STACKADJ_REG CRIS_STRUCT_VALUE_REGNUM |
0b85d816 HPN |
623 | #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (SImode, CRIS_STACKADJ_REG) |
624 | ||
625 | #define EH_RETURN_HANDLER_RTX \ | |
626 | cris_return_addr_rtx (0, NULL) | |
627 | ||
628 | #define INIT_EXPANDERS cris_init_expanders () | |
629 | ||
630 | /* FIXME: Move this to right node (it's not documented properly yet). */ | |
631 | #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (CRIS_SRP_REGNUM) | |
632 | ||
633 | /* FIXME: Move this to right node (it's not documented properly yet). | |
634 | FIXME: Check what alignment we can assume regarding | |
635 | TARGET_STACK_ALIGN and TARGET_ALIGN_BY_32. */ | |
636 | #define DWARF_CIE_DATA_ALIGNMENT -1 | |
637 | ||
a338be44 KG |
638 | /* If we would ever need an exact mapping between canonical register |
639 | number and dwarf frame register, we would either need to include all | |
839a4992 | 640 | registers in the gcc description (with some marked fixed of course), or |
a338be44 KG |
641 | an inverse mapping from dwarf register to gcc register. There is one |
642 | need in dwarf2out.c:expand_builtin_init_dwarf_reg_sizes. Right now, I | |
643 | don't see that we need exact correspondence between DWARF *frame* | |
644 | registers and DBX_REGISTER_NUMBER, so map them onto GCC registers. */ | |
645 | #define DWARF_FRAME_REGNUM(REG) (REG) | |
646 | ||
0b85d816 HPN |
647 | /* Node: Stack Checking */ |
648 | /* (no definitions) FIXME: Check. */ | |
649 | ||
650 | /* Node: Frame Registers */ | |
651 | ||
f60c7155 | 652 | #define STACK_POINTER_REGNUM CRIS_SP_REGNUM |
0b85d816 HPN |
653 | |
654 | /* Register used for frame pointer. This is also the last of the saved | |
e5837c07 | 655 | registers, when a frame pointer is not used. */ |
f60c7155 | 656 | #define FRAME_POINTER_REGNUM CRIS_FP_REGNUM |
0b85d816 HPN |
657 | |
658 | /* Faked register, is always eliminated. We need it to eliminate | |
659 | allocating stack slots for the return address and the frame pointer. */ | |
f60c7155 | 660 | #define ARG_POINTER_REGNUM CRIS_AP_REGNUM |
0b85d816 | 661 | |
f60c7155 | 662 | #define STATIC_CHAIN_REGNUM CRIS_STATIC_CHAIN_REGNUM |
0b85d816 HPN |
663 | |
664 | ||
665 | /* Node: Elimination */ | |
666 | ||
0b85d816 HPN |
667 | #define ELIMINABLE_REGS \ |
668 | {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ | |
669 | {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ | |
670 | {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} | |
671 | ||
0b85d816 HPN |
672 | #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ |
673 | (OFFSET) = cris_initial_elimination_offset (FROM, TO) | |
674 | ||
675 | ||
676 | /* Node: Stack Arguments */ | |
677 | ||
678 | /* Since many parameters take up one register each in any case, | |
a2fef3a4 KH |
679 | defining TARGET_PROMOTE_PROTOTYPES that always returns true would |
680 | seem like a good idea, but measurements indicate that a combination | |
681 | using PROMOTE_MODE is better. */ | |
0b85d816 HPN |
682 | |
683 | #define ACCUMULATE_OUTGOING_ARGS 1 | |
684 | ||
0b85d816 HPN |
685 | |
686 | /* Node: Register Arguments */ | |
687 | ||
0b85d816 HPN |
688 | /* Contrary to what you'd believe, defining FUNCTION_ARG_CALLEE_COPIES |
689 | seems like a (small total) loss, at least for gcc-2.7.2 compiling and | |
690 | running gcc-2.1 (small win in size, small loss running -- 100.1%), | |
691 | and similarly for size for products (.1 .. .3% bloat, sometimes win). | |
692 | Due to the empirical likeliness of making slower code, it is not | |
693 | defined. */ | |
694 | ||
695 | /* This no longer *needs* to be a structure; but keeping it as such should | |
696 | not hurt (and hacking the ABI is simpler). */ | |
697 | #define CUMULATIVE_ARGS struct cum_args | |
698 | struct cum_args {int regs;}; | |
699 | ||
700 | /* The regs member is an integer, the number of arguments got into | |
fa5848c7 | 701 | registers so far. */ |
0f6937fe | 702 | #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ |
0b85d816 HPN |
703 | ((CUM).regs = 0) |
704 | ||
0b85d816 HPN |
705 | #define FUNCTION_ARG_REGNO_P(REGNO) \ |
706 | ((REGNO) >= CRIS_FIRST_ARG_REG \ | |
707 | && (REGNO) < CRIS_FIRST_ARG_REG + (CRIS_MAX_ARGS_IN_REGS)) | |
708 | ||
709 | ||
0b85d816 HPN |
710 | /* Node: Aggregate Return */ |
711 | ||
a2fef3a4 | 712 | #define CRIS_STRUCT_VALUE_REGNUM ((CRIS_FIRST_ARG_REG) - 1) |
0b85d816 HPN |
713 | |
714 | ||
715 | /* Node: Caller Saves */ | |
716 | /* (no definitions) */ | |
717 | ||
718 | /* Node: Function entry */ | |
719 | ||
720 | /* See cris.c for TARGET_ASM_FUNCTION_PROLOGUE and | |
721 | TARGET_ASM_FUNCTION_EPILOGUE. */ | |
722 | ||
0b85d816 HPN |
723 | /* Node: Profiling */ |
724 | ||
725 | #define FUNCTION_PROFILER(FILE, LABELNO) \ | |
c725bd79 | 726 | error ("no FUNCTION_PROFILER for CRIS") |
0b85d816 | 727 | |
0b85d816 HPN |
728 | /* FIXME: Some of the undefined macros might be mandatory. If so, fix |
729 | documentation. */ | |
730 | ||
731 | ||
0b85d816 HPN |
732 | /* Node: Trampolines */ |
733 | ||
6725c402 | 734 | #define TRAMPOLINE_SIZE (TARGET_V32 ? 58 : 32) |
0b85d816 | 735 | |
3e322b77 | 736 | /* CRIS wants instructions on word-boundary. */ |
0b85d816 HPN |
737 | #define TRAMPOLINE_ALIGNMENT 16 |
738 | ||
0b85d816 HPN |
739 | /* Node: Library Calls */ |
740 | ||
0b85d816 HPN |
741 | /* If you change this, you have to check whatever libraries and systems |
742 | that use it. */ | |
743 | #define TARGET_EDOM 33 | |
744 | ||
745 | ||
746 | /* Node: Addressing Modes */ | |
747 | ||
748 | #define HAVE_POST_INCREMENT 1 | |
749 | ||
a502bdb6 HPN |
750 | #define CONSTANT_ADDRESS_P(X) \ |
751 | (CONSTANT_P (X) && cris_legitimate_address_p (QImode, X, false)) | |
752 | ||
6725c402 HPN |
753 | /* Must be a compile-time constant, so we go with the highest value |
754 | among all CRIS variants. */ | |
0b85d816 HPN |
755 | #define MAX_REGS_PER_ADDRESS 2 |
756 | ||
15883505 HPN |
757 | /* Fix reloads known to cause suboptimal spilling. */ |
758 | #define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, INDL, WIN) \ | |
759 | do \ | |
760 | { \ | |
761 | if (cris_reload_address_legitimized (X, MODE, OPNUM, TYPE, INDL)) \ | |
762 | goto WIN; \ | |
763 | } \ | |
764 | while (0) | |
765 | ||
ab4e53fe HPN |
766 | /* The mode argument to cris_legitimate_constant_p isn't used, so just |
767 | pass a cheap dummy. N.B. we have to cast away const from the | |
768 | parameter rather than adjust the parameter, as it's type is mandated | |
769 | by the TARGET_LEGITIMATE_CONSTANT_P target hook interface. */ | |
770 | #define CRIS_CONSTANT_P(X) \ | |
771 | (CONSTANT_P (X) && cris_legitimate_constant_p (VOIDmode, CONST_CAST_RTX (X))) | |
0b85d816 HPN |
772 | |
773 | /* Node: Condition Code */ | |
774 | ||
775 | #define NOTICE_UPDATE_CC(EXP, INSN) cris_notice_update_cc (EXP, INSN) | |
776 | ||
777 | /* FIXME: Maybe define CANONICALIZE_COMPARISON later, when playing with | |
778 | optimizations. It is needed; currently we do this with instruction | |
779 | patterns and NOTICE_UPDATE_CC. */ | |
780 | ||
781 | ||
782 | /* Node: Costs */ | |
783 | ||
0b85d816 HPN |
784 | /* Regardless of the presence of delay slots, the default value of 1 for |
785 | BRANCH_COST is the best in the range (1, 2, 3), tested with gcc-2.7.2 | |
786 | with testcases ipps and gcc, giving smallest and fastest code. */ | |
787 | ||
788 | #define SLOW_BYTE_ACCESS 0 | |
789 | ||
790 | /* This is the threshold *below* which inline move sequences of | |
791 | word-length sizes will be emitted. The "9" will translate to | |
792 | (9 - 1) * 4 = 32 bytes maximum moved, but using 16 instructions | |
793 | (8 instruction sequences) or less. */ | |
e04ad03d | 794 | #define MOVE_RATIO(speed) 9 |
0b85d816 HPN |
795 | |
796 | ||
797 | /* Node: Sections */ | |
798 | ||
799 | #define TEXT_SECTION_ASM_OP "\t.text" | |
800 | ||
801 | #define DATA_SECTION_ASM_OP "\t.data" | |
802 | ||
0b85d816 HPN |
803 | /* The jump table is immediately connected to the preceding insn. */ |
804 | #define JUMP_TABLES_IN_TEXT_SECTION 1 | |
805 | ||
0b85d816 HPN |
806 | |
807 | /* Node: PIC */ | |
808 | ||
c00fc5cf HPN |
809 | /* Helper type. */ |
810 | ||
ab4e53fe | 811 | enum cris_symbol_type |
c00fc5cf HPN |
812 | { |
813 | cris_no_symbol = 0, | |
814 | cris_got_symbol = 1, | |
6725c402 | 815 | cris_rel_symbol = 2, |
c00fc5cf | 816 | cris_got_symbol_needing_fixup = 3, |
ab4e53fe HPN |
817 | cris_unspec = 7, |
818 | cris_offsettable_symbol = 8 | |
c00fc5cf HPN |
819 | }; |
820 | ||
f60c7155 | 821 | #define PIC_OFFSET_TABLE_REGNUM (flag_pic ? CRIS_GOT_REGNUM : INVALID_REGNUM) |
0b85d816 HPN |
822 | |
823 | #define LEGITIMATE_PIC_OPERAND_P(X) cris_legitimate_pic_operand (X) | |
824 | ||
825 | ||
826 | /* Node: File Framework */ | |
827 | ||
0b85d816 | 828 | /* We don't want an .ident for gcc. To avoid that but still support |
a8781821 SB |
829 | #ident, we override TARGET_ASM_OUTPUT_IDENT and, since the gcc .ident |
830 | is its only use besides front-end .ident directives, we return if | |
3dafb85c | 831 | the state if the cgraph is not PARSING. */ |
a8781821 SB |
832 | #undef TARGET_ASM_OUTPUT_IDENT |
833 | #define TARGET_ASM_OUTPUT_IDENT cris_asm_output_ident | |
0b85d816 HPN |
834 | |
835 | #define ASM_APP_ON "#APP\n" | |
836 | ||
837 | #define ASM_APP_OFF "#NO_APP\n" | |
838 | ||
839 | ||
840 | /* Node: Data Output */ | |
841 | ||
980d8882 | 842 | #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) (C) == '@' |
0b85d816 | 843 | |
0b85d816 HPN |
844 | /* Node: Uninitialized Data */ |
845 | ||
846 | /* Remember to round off odd values if we want data alignment, | |
847 | since we cannot do that with an .align directive. | |
848 | ||
849 | Using .comm causes the space not to be reserved in .bss, but by | |
850 | tricks with the symbol type. Not good if other tools than binutils | |
851 | are used on the object files. Since ".global ... .lcomm ..." works, we | |
852 | use that. Use .._ALIGNED_COMMON, since gcc whines when we only have | |
d6a7951f | 853 | ..._COMMON, and we prefer to whine ourselves; BIGGEST_ALIGNMENT is not |
0df965d7 | 854 | the one to check. */ |
0b85d816 HPN |
855 | /* FIXME: I suspect a bug in gcc with alignment. Do not warn until |
856 | investigated; it mucks up the testsuite results. */ | |
857 | #define CRIS_ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN, LOCAL) \ | |
858 | do \ | |
859 | { \ | |
860 | int align_ = (ALIGN) / BITS_PER_UNIT; \ | |
861 | if (TARGET_DATA_ALIGN && TARGET_ALIGN_BY_32 && align_ < 4) \ | |
862 | align_ = 4; \ | |
863 | else if (TARGET_DATA_ALIGN && align_ < 2) \ | |
864 | align_ = 2; \ | |
865 | /* FIXME: Do we need this? */ \ | |
866 | else if (align_ < 1) \ | |
867 | align_ = 1; \ | |
868 | \ | |
0df965d7 | 869 | if (LOCAL) \ |
0b85d816 | 870 | { \ |
0df965d7 | 871 | fprintf ((FILE), "%s", LOCAL_ASM_OP); \ |
0b85d816 | 872 | assemble_name ((FILE), (NAME)); \ |
0df965d7 | 873 | fprintf ((FILE), "\n"); \ |
0b85d816 | 874 | } \ |
0df965d7 SB |
875 | fprintf ((FILE), "%s", COMMON_ASM_OP); \ |
876 | assemble_name ((FILE), (NAME)); \ | |
877 | fprintf ((FILE), ",%u,%u\n", (int)(SIZE), align_); \ | |
0b85d816 HPN |
878 | } \ |
879 | while (0) | |
880 | ||
881 | #define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \ | |
882 | CRIS_ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN, 0) | |
883 | ||
884 | #undef ASM_OUTPUT_ALIGNED_DECL_LOCAL | |
885 | #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \ | |
886 | CRIS_ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN, 1) | |
887 | ||
0b85d816 HPN |
888 | /* Node: Label Output */ |
889 | ||
506a61b1 KG |
890 | /* Globalizing directive for a label. */ |
891 | #define GLOBAL_ASM_OP "\t.global " | |
0b85d816 HPN |
892 | |
893 | #define SUPPORTS_WEAK 1 | |
894 | ||
453bd0f5 HPN |
895 | #define ASM_OUTPUT_SYMBOL_REF(STREAM, SYM) \ |
896 | cris_asm_output_symbol_ref (STREAM, SYM) | |
897 | ||
898 | #define ASM_OUTPUT_LABEL_REF(STREAM, BUF) \ | |
899 | cris_asm_output_label_ref (STREAM, BUF) | |
900 | ||
0b85d816 HPN |
901 | /* Remove any previous definition (elfos.h). */ |
902 | #undef ASM_GENERATE_INTERNAL_LABEL | |
903 | #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ | |
904 | sprintf (LABEL, "*%s%s%ld", LOCAL_LABEL_PREFIX, PREFIX, (long) NUM) | |
905 | ||
0b85d816 HPN |
906 | /* Node: Initialization */ |
907 | /* (no definitions) */ | |
908 | ||
909 | /* Node: Macros for Initialization */ | |
44a4ca5e | 910 | /* (no definitions) */ |
0b85d816 HPN |
911 | |
912 | /* Node: Instruction Output */ | |
913 | ||
914 | #define REGISTER_NAMES \ | |
915 | {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", \ | |
6725c402 | 916 | "r9", "r10", "r11", "r12", "r13", "sp", "acr", "srp", "mof", "faked_ap", "dccr"} |
0b85d816 HPN |
917 | |
918 | #define ADDITIONAL_REGISTER_NAMES \ | |
6725c402 | 919 | {{"r14", 14}, {"r15", 15}, {"pc", 15}} |
0b85d816 | 920 | |
0b85d816 HPN |
921 | /* Output an empty line to illustrate the presence of the delay slot. */ |
922 | #define DBR_OUTPUT_SEQEND(FILE) \ | |
923 | fprintf (FILE, "\n") | |
924 | ||
0df965d7 | 925 | #define LOCAL_LABEL_PREFIX "." |
0b85d816 HPN |
926 | |
927 | /* cppinit.c initializes a const array from this, so it must be constant, | |
928 | can't have it different based on options. Luckily, the prefix is | |
929 | always allowed, so let's have it on all GCC-generated code. Note that | |
930 | we have this verbatim everywhere in the back-end, not using %R or %s or | |
931 | such. */ | |
932 | #define REGISTER_PREFIX "$" | |
933 | ||
934 | /* Remove any previous definition (elfos.h). */ | |
935 | /* We use -fno-leading-underscore to remove it, when necessary. */ | |
936 | #undef USER_LABEL_PREFIX | |
937 | #define USER_LABEL_PREFIX "_" | |
938 | ||
6725c402 HPN |
939 | #define ASM_OUTPUT_REG_PUSH(FILE, REGNO) \ |
940 | fprintf (FILE, \ | |
941 | TARGET_V32 \ | |
942 | ? "\tsubq 4,$sp\n\tmove $%s,[$sp]\n" : "\tpush $%s\n", \ | |
943 | reg_names[REGNO]) | |
0b85d816 HPN |
944 | |
945 | #define ASM_OUTPUT_REG_POP(FILE, REGNO) \ | |
6725c402 | 946 | fprintf (FILE, "\tmove [$sp+],$%s\n", reg_names[REGNO]) |
0b85d816 HPN |
947 | |
948 | ||
949 | /* Node: Dispatch Tables */ | |
950 | ||
6725c402 HPN |
951 | #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ |
952 | do \ | |
953 | { \ | |
954 | if (TARGET_V32) \ | |
955 | asm_fprintf (FILE, "\t.word %LL%d-.\n", VALUE); \ | |
956 | else \ | |
957 | asm_fprintf (FILE, "\t.word %LL%d-%LL%d\n", VALUE, REL); \ | |
958 | } \ | |
959 | while (0) | |
0b85d816 HPN |
960 | |
961 | #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ | |
962 | asm_fprintf (FILE, "\t.dword %LL%d\n", VALUE) | |
963 | ||
964 | /* Defined to also emit an .align in elfos.h. We don't want that. */ | |
965 | #undef ASM_OUTPUT_CASE_LABEL | |
966 | ||
967 | /* Since the "bound" insn loads the comparison value if the compared< | |
968 | value (register) is out of bounds (0..comparison value-1), we need | |
969 | to output another case to catch it. | |
970 | The way to find it is to look for the label_ref at the else-arm inside | |
971 | the expanded casesi core-insn. | |
972 | FIXME: Check this construct when changing to new version of gcc. */ | |
973 | #define ASM_OUTPUT_CASE_END(STREAM, NUM, TABLE) \ | |
6725c402 | 974 | cris_asm_output_case_end (STREAM, NUM, TABLE) |
0b85d816 HPN |
975 | |
976 | ||
977 | /* Node: Exception Region Output */ | |
978 | /* (no definitions) */ | |
979 | /* FIXME: Fill in with our own optimized layout. */ | |
980 | ||
981 | /* Node: Alignment Output */ | |
982 | ||
983 | #define ASM_OUTPUT_ALIGN(FILE, LOG) \ | |
984 | fprintf (FILE, "\t.align %d\n", (LOG)) | |
985 | ||
986 | ||
987 | /* Node: All Debuggers */ | |
988 | ||
f60c7155 HPN |
989 | #define DBX_REGISTER_NUMBER(REGNO) \ |
990 | ((REGNO) == CRIS_SRP_REGNUM ? CRIS_CANONICAL_SRP_REGNUM : \ | |
991 | (REGNO) == CRIS_MOF_REGNUM ? CRIS_CANONICAL_MOF_REGNUM : \ | |
f9968e3e | 992 | (REGNO) == CRIS_CC0_REGNUM ? CRIS_CANONICAL_CC0_REGNUM : \ |
f60c7155 | 993 | (REGNO)) |
0b85d816 HPN |
994 | |
995 | /* FIXME: Investigate DEBUGGER_AUTO_OFFSET, DEBUGGER_ARG_OFFSET. */ | |
996 | ||
997 | ||
998 | /* Node: DBX Options */ | |
999 | ||
e5837c07 | 1000 | /* Is this correct? Check later. */ |
0b85d816 HPN |
1001 | #define DBX_NO_XREFS |
1002 | ||
1003 | #define DBX_CONTIN_LENGTH 0 | |
1004 | ||
1005 | /* FIXME: Is this needed when we have 0 DBX_CONTIN_LENGTH? */ | |
1006 | #define DBX_CONTIN_CHAR '?' | |
1007 | ||
1008 | ||
1009 | /* Node: DBX Hooks */ | |
1010 | /* (no definitions) */ | |
1011 | ||
1012 | /* Node: File names and DBX */ | |
1013 | /* (no definitions) */ | |
1014 | ||
1015 | ||
1016 | /* Node: SDB and DWARF */ | |
d94084f7 | 1017 | /* (no definitions) */ |
0b85d816 | 1018 | |
0b85d816 HPN |
1019 | /* Node: Misc */ |
1020 | ||
0b85d816 HPN |
1021 | /* A combination of the bound (umin) insn together with a |
1022 | sign-extended add via the table to PC seems optimal. | |
1023 | If the table overflows, the assembler will take care of it. | |
1024 | Theoretically, in extreme cases (uncertain if they occur), an error | |
1025 | will be emitted, so FIXME: Check how large case-tables are emitted, | |
1026 | possible add an option to emit SImode case-tables. */ | |
1027 | #define CASE_VECTOR_MODE HImode | |
1028 | ||
1029 | #define CASE_VECTOR_PC_RELATIVE 1 | |
1030 | ||
1031 | /* FIXME: Investigate CASE_VECTOR_SHORTEN_MODE to make sure HImode is not | |
109b748d | 1032 | used when broken-.word could possibly fail (plus testcase). */ |
0b85d816 | 1033 | |
0b85d816 HPN |
1034 | /* This is the number of bytes that can be moved in one |
1035 | reasonably fast instruction sequence. For CRIS, this is two | |
1036 | instructions: mem => reg, reg => mem. */ | |
1037 | #define MOVE_MAX 4 | |
1038 | ||
1039 | /* Maybe SHIFT_COUNT_TRUNCATED is safe to define? FIXME: Check later. */ | |
1040 | ||
1041 | #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 | |
1042 | ||
e636e508 | 1043 | #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1) |
9ef4a0cd | 1044 | #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1) |
e636e508 | 1045 | |
0b85d816 HPN |
1046 | #define Pmode SImode |
1047 | ||
1048 | #define FUNCTION_MODE QImode | |
1049 | ||
1050 | #define NO_IMPLICIT_EXTERN_C | |
1051 | ||
1052 | /* | |
1053 | * Local variables: | |
1054 | * eval: (c-set-style "gnu") | |
1055 | * indent-tabs-mode: t | |
1056 | * End: | |
1057 | */ |