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