]>
Commit | Line | Data |
---|---|---|
43e9d192 | 1 | /* Machine description for AArch64 architecture. |
8d9254fc | 2 | Copyright (C) 2009-2020 Free Software Foundation, Inc. |
43e9d192 IB |
3 | Contributed by ARM Ltd. |
4 | ||
5 | This file is part of GCC. | |
6 | ||
7 | GCC is free software; you can redistribute it and/or modify it | |
8 | under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 3, or (at your option) | |
10 | any later version. | |
11 | ||
12 | GCC is distributed in the hope that it will be useful, but | |
13 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 | General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GCC; see the file COPYING3. If not see | |
19 | <http://www.gnu.org/licenses/>. */ | |
20 | ||
21 | ||
22 | #ifndef GCC_AARCH64_H | |
23 | #define GCC_AARCH64_H | |
24 | ||
25 | /* Target CPU builtins. */ | |
e4ea20c8 KT |
26 | #define TARGET_CPU_CPP_BUILTINS() \ |
27 | aarch64_cpu_cpp_builtins (pfile) | |
43e9d192 | 28 | |
b4c522fa IB |
29 | /* Target CPU versions for D. */ |
30 | #define TARGET_D_CPU_VERSIONS aarch64_d_target_versions | |
31 | ||
43e9d192 IB |
32 | \f |
33 | ||
e4ea20c8 KT |
34 | #define REGISTER_TARGET_PRAGMAS() aarch64_register_pragmas () |
35 | ||
43e9d192 IB |
36 | /* Target machine storage layout. */ |
37 | ||
38 | #define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \ | |
39 | if (GET_MODE_CLASS (MODE) == MODE_INT \ | |
40 | && GET_MODE_SIZE (MODE) < 4) \ | |
41 | { \ | |
42 | if (MODE == QImode || MODE == HImode) \ | |
43 | { \ | |
44 | MODE = SImode; \ | |
45 | } \ | |
46 | } | |
47 | ||
48 | /* Bits are always numbered from the LSBit. */ | |
49 | #define BITS_BIG_ENDIAN 0 | |
50 | ||
51 | /* Big/little-endian flavour. */ | |
52 | #define BYTES_BIG_ENDIAN (TARGET_BIG_END != 0) | |
53 | #define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN) | |
54 | ||
55 | /* AdvSIMD is supported in the default configuration, unless disabled by | |
683e3333 KT |
56 | -mgeneral-regs-only or by the +nosimd extension. */ |
57 | #define TARGET_SIMD (!TARGET_GENERAL_REGS_ONLY && AARCH64_ISA_SIMD) | |
58 | #define TARGET_FLOAT (!TARGET_GENERAL_REGS_ONLY && AARCH64_ISA_FP) | |
43e9d192 IB |
59 | |
60 | #define UNITS_PER_WORD 8 | |
61 | ||
62 | #define UNITS_PER_VREG 16 | |
63 | ||
64 | #define PARM_BOUNDARY 64 | |
65 | ||
66 | #define STACK_BOUNDARY 128 | |
67 | ||
68 | #define FUNCTION_BOUNDARY 32 | |
69 | ||
70 | #define EMPTY_FIELD_BOUNDARY 32 | |
71 | ||
72 | #define BIGGEST_ALIGNMENT 128 | |
73 | ||
74 | #define SHORT_TYPE_SIZE 16 | |
75 | ||
76 | #define INT_TYPE_SIZE 32 | |
77 | ||
17a819cb YZ |
78 | #define LONG_TYPE_SIZE (TARGET_ILP32 ? 32 : 64) |
79 | ||
80 | #define POINTER_SIZE (TARGET_ILP32 ? 32 : 64) | |
43e9d192 IB |
81 | |
82 | #define LONG_LONG_TYPE_SIZE 64 | |
83 | ||
84 | #define FLOAT_TYPE_SIZE 32 | |
85 | ||
86 | #define DOUBLE_TYPE_SIZE 64 | |
87 | ||
88 | #define LONG_DOUBLE_TYPE_SIZE 128 | |
89 | ||
cd1bef27 JL |
90 | /* This value is the amount of bytes a caller is allowed to drop the stack |
91 | before probing has to be done for stack clash protection. */ | |
92 | #define STACK_CLASH_CALLER_GUARD 1024 | |
93 | ||
8c6e3b23 TC |
94 | /* This value represents the minimum amount of bytes we expect the function's |
95 | outgoing arguments to be when stack-clash is enabled. */ | |
96 | #define STACK_CLASH_MIN_BYTES_OUTGOING_ARGS 8 | |
97 | ||
cd1bef27 JL |
98 | /* This value controls how many pages we manually unroll the loop for when |
99 | generating stack clash probes. */ | |
100 | #define STACK_CLASH_MAX_UNROLL_PAGES 4 | |
101 | ||
43e9d192 IB |
102 | /* The architecture reserves all bits of the address for hardware use, |
103 | so the vbit must go into the delta field of pointers to member | |
104 | functions. This is the same config as that in the AArch32 | |
105 | port. */ | |
106 | #define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_delta | |
107 | ||
98503487 RR |
108 | /* Align definitions of arrays, unions and structures so that |
109 | initializations and copies can be made more efficient. This is not | |
110 | ABI-changing, so it only affects places where we can see the | |
111 | definition. Increasing the alignment tends to introduce padding, | |
112 | so don't do this when optimizing for size/conserving stack space. */ | |
113 | #define AARCH64_EXPAND_ALIGNMENT(COND, EXP, ALIGN) \ | |
114 | (((COND) && ((ALIGN) < BITS_PER_WORD) \ | |
115 | && (TREE_CODE (EXP) == ARRAY_TYPE \ | |
116 | || TREE_CODE (EXP) == UNION_TYPE \ | |
117 | || TREE_CODE (EXP) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN)) | |
118 | ||
119 | /* Align global data. */ | |
120 | #define DATA_ALIGNMENT(EXP, ALIGN) \ | |
121 | AARCH64_EXPAND_ALIGNMENT (!optimize_size, EXP, ALIGN) | |
122 | ||
123 | /* Similarly, make sure that objects on the stack are sensibly aligned. */ | |
124 | #define LOCAL_ALIGNMENT(EXP, ALIGN) \ | |
125 | AARCH64_EXPAND_ALIGNMENT (!flag_conserve_stack, EXP, ALIGN) | |
43e9d192 IB |
126 | |
127 | #define STRUCTURE_SIZE_BOUNDARY 8 | |
128 | ||
e10dbae3 WD |
129 | /* Heap alignment (same as BIGGEST_ALIGNMENT and STACK_BOUNDARY). */ |
130 | #define MALLOC_ABI_ALIGNMENT 128 | |
131 | ||
43e9d192 IB |
132 | /* Defined by the ABI */ |
133 | #define WCHAR_TYPE "unsigned int" | |
134 | #define WCHAR_TYPE_SIZE 32 | |
135 | ||
136 | /* Using long long breaks -ansi and -std=c90, so these will need to be | |
137 | made conditional for an LLP64 ABI. */ | |
138 | ||
139 | #define SIZE_TYPE "long unsigned int" | |
140 | ||
141 | #define PTRDIFF_TYPE "long int" | |
142 | ||
143 | #define PCC_BITFIELD_TYPE_MATTERS 1 | |
144 | ||
0c6caaf8 RL |
145 | /* Major revision number of the ARM Architecture implemented by the target. */ |
146 | extern unsigned aarch64_architecture_version; | |
43e9d192 IB |
147 | |
148 | /* Instruction tuning/selection flags. */ | |
149 | ||
150 | /* Bit values used to identify processor capabilities. */ | |
151 | #define AARCH64_FL_SIMD (1 << 0) /* Has SIMD instructions. */ | |
152 | #define AARCH64_FL_FP (1 << 1) /* Has FP. */ | |
153 | #define AARCH64_FL_CRYPTO (1 << 2) /* Has crypto. */ | |
95f99170 | 154 | #define AARCH64_FL_CRC (1 << 3) /* Has CRC. */ |
74bb9de4 | 155 | /* ARMv8.1-A architecture extensions. */ |
dfba575f | 156 | #define AARCH64_FL_LSE (1 << 4) /* Has Large System Extensions. */ |
1ddc47c0 TC |
157 | #define AARCH64_FL_RDMA (1 << 5) /* Has Round Double Multiply Add. */ |
158 | #define AARCH64_FL_V8_1 (1 << 6) /* Has ARMv8.1-A extensions. */ | |
c61465bd | 159 | /* ARMv8.2-A architecture extensions. */ |
1ddc47c0 | 160 | #define AARCH64_FL_V8_2 (1 << 8) /* Has ARMv8.2-A features. */ |
c61465bd | 161 | #define AARCH64_FL_F16 (1 << 9) /* Has ARMv8.2-A FP16 extensions. */ |
43cacb12 | 162 | #define AARCH64_FL_SVE (1 << 10) /* Has Scalable Vector Extensions. */ |
d766c52b | 163 | /* ARMv8.3-A architecture extensions. */ |
43cacb12 RS |
164 | #define AARCH64_FL_V8_3 (1 << 11) /* Has ARMv8.3-A features. */ |
165 | #define AARCH64_FL_RCPC (1 << 12) /* Has support for RCpc model. */ | |
166 | #define AARCH64_FL_DOTPROD (1 << 13) /* Has ARMv8.2-A Dot Product ins. */ | |
27086ea3 | 167 | /* New flags to split crypto into aes and sha2. */ |
43cacb12 RS |
168 | #define AARCH64_FL_AES (1 << 14) /* Has Crypto AES. */ |
169 | #define AARCH64_FL_SHA2 (1 << 15) /* Has Crypto SHA2. */ | |
27086ea3 | 170 | /* ARMv8.4-A architecture extensions. */ |
43cacb12 RS |
171 | #define AARCH64_FL_V8_4 (1 << 16) /* Has ARMv8.4-A features. */ |
172 | #define AARCH64_FL_SM4 (1 << 17) /* Has ARMv8.4-A SM3 and SM4. */ | |
173 | #define AARCH64_FL_SHA3 (1 << 18) /* Has ARMv8.4-a SHA3 and SHA512. */ | |
174 | #define AARCH64_FL_F16FML (1 << 19) /* Has ARMv8.4-a FP16 extensions. */ | |
3c5af608 | 175 | #define AARCH64_FL_RCPC8_4 (1 << 20) /* Has ARMv8.4-a RCPC extensions. */ |
43e9d192 | 176 | |
5170e47e | 177 | /* Statistical Profiling extensions. */ |
3c5af608 | 178 | #define AARCH64_FL_PROFILE (1 << 21) |
5170e47e | 179 | |
59beeb62 SD |
180 | /* ARMv8.5-A architecture extensions. */ |
181 | #define AARCH64_FL_V8_5 (1 << 22) /* Has ARMv8.5-A features. */ | |
9b4247de SD |
182 | #define AARCH64_FL_RNG (1 << 23) /* ARMv8.5-A Random Number Insns. */ |
183 | #define AARCH64_FL_MEMTAG (1 << 24) /* ARMv8.5-A Memory Tagging | |
184 | Extensions. */ | |
185 | ||
186 | /* Speculation Barrier instruction supported. */ | |
187 | #define AARCH64_FL_SB (1 << 25) | |
188 | ||
189 | /* Speculative Store Bypass Safe instruction supported. */ | |
190 | #define AARCH64_FL_SSBS (1 << 26) | |
191 | ||
192 | /* Execution and Data Prediction Restriction instructions supported. */ | |
193 | #define AARCH64_FL_PREDRES (1 << 27) | |
59beeb62 | 194 | |
28108a53 MM |
195 | /* SVE2 instruction supported. */ |
196 | #define AARCH64_FL_SVE2 (1 << 28) | |
197 | #define AARCH64_FL_SVE2_AES (1 << 29) | |
198 | #define AARCH64_FL_SVE2_SM4 (1 << 30) | |
199 | #define AARCH64_FL_SVE2_SHA3 (1ULL << 31) | |
200 | #define AARCH64_FL_SVE2_BITPERM (1ULL << 32) | |
201 | ||
89626179 SD |
202 | /* Transactional Memory Extension. */ |
203 | #define AARCH64_FL_TME (1ULL << 33) /* Has TME instructions. */ | |
204 | ||
a93e1d5c DZ |
205 | /* Armv8.6-A architecture extensions. */ |
206 | #define AARCH64_FL_V8_6 (1ULL << 34) | |
207 | ||
208 | /* 8-bit Integer Matrix Multiply (I8MM) extensions. */ | |
209 | #define AARCH64_FL_I8MM (1ULL << 35) | |
210 | ||
211 | /* Brain half-precision floating-point (BFloat16) Extension. */ | |
212 | #define AARCH64_FL_BF16 (1ULL << 36) | |
213 | ||
43e9d192 IB |
214 | /* Has FP and SIMD. */ |
215 | #define AARCH64_FL_FPSIMD (AARCH64_FL_FP | AARCH64_FL_SIMD) | |
216 | ||
217 | /* Has FP without SIMD. */ | |
218 | #define AARCH64_FL_FPQ16 (AARCH64_FL_FP & ~AARCH64_FL_SIMD) | |
219 | ||
220 | /* Architecture flags that effect instruction selection. */ | |
221 | #define AARCH64_FL_FOR_ARCH8 (AARCH64_FL_FPSIMD) | |
ff09c88d | 222 | #define AARCH64_FL_FOR_ARCH8_1 \ |
43f84f6c JW |
223 | (AARCH64_FL_FOR_ARCH8 | AARCH64_FL_LSE | AARCH64_FL_CRC \ |
224 | | AARCH64_FL_RDMA | AARCH64_FL_V8_1) | |
c61465bd MW |
225 | #define AARCH64_FL_FOR_ARCH8_2 \ |
226 | (AARCH64_FL_FOR_ARCH8_1 | AARCH64_FL_V8_2) | |
d766c52b JW |
227 | #define AARCH64_FL_FOR_ARCH8_3 \ |
228 | (AARCH64_FL_FOR_ARCH8_2 | AARCH64_FL_V8_3) | |
27086ea3 | 229 | #define AARCH64_FL_FOR_ARCH8_4 \ |
ec538483 | 230 | (AARCH64_FL_FOR_ARCH8_3 | AARCH64_FL_V8_4 | AARCH64_FL_F16FML \ |
3c5af608 | 231 | | AARCH64_FL_DOTPROD | AARCH64_FL_RCPC8_4) |
59beeb62 | 232 | #define AARCH64_FL_FOR_ARCH8_5 \ |
9b4247de SD |
233 | (AARCH64_FL_FOR_ARCH8_4 | AARCH64_FL_V8_5 \ |
234 | | AARCH64_FL_SB | AARCH64_FL_SSBS | AARCH64_FL_PREDRES) | |
a93e1d5c DZ |
235 | #define AARCH64_FL_FOR_ARCH8_6 \ |
236 | (AARCH64_FL_FOR_ARCH8_5 | AARCH64_FL_V8_6 | AARCH64_FL_FPSIMD \ | |
237 | | AARCH64_FL_I8MM | AARCH64_FL_BF16) | |
43e9d192 IB |
238 | |
239 | /* Macros to test ISA flags. */ | |
361fb3ee | 240 | |
5922847b | 241 | #define AARCH64_ISA_CRC (aarch64_isa_flags & AARCH64_FL_CRC) |
43e9d192 IB |
242 | #define AARCH64_ISA_CRYPTO (aarch64_isa_flags & AARCH64_FL_CRYPTO) |
243 | #define AARCH64_ISA_FP (aarch64_isa_flags & AARCH64_FL_FP) | |
244 | #define AARCH64_ISA_SIMD (aarch64_isa_flags & AARCH64_FL_SIMD) | |
045c2d32 | 245 | #define AARCH64_ISA_LSE (aarch64_isa_flags & AARCH64_FL_LSE) |
43f84f6c | 246 | #define AARCH64_ISA_RDMA (aarch64_isa_flags & AARCH64_FL_RDMA) |
c61465bd MW |
247 | #define AARCH64_ISA_V8_2 (aarch64_isa_flags & AARCH64_FL_V8_2) |
248 | #define AARCH64_ISA_F16 (aarch64_isa_flags & AARCH64_FL_F16) | |
43cacb12 | 249 | #define AARCH64_ISA_SVE (aarch64_isa_flags & AARCH64_FL_SVE) |
0617e23c | 250 | #define AARCH64_ISA_SVE2 (aarch64_isa_flags & AARCH64_FL_SVE2) |
d766c52b | 251 | #define AARCH64_ISA_V8_3 (aarch64_isa_flags & AARCH64_FL_V8_3) |
1ddc47c0 | 252 | #define AARCH64_ISA_DOTPROD (aarch64_isa_flags & AARCH64_FL_DOTPROD) |
27086ea3 MC |
253 | #define AARCH64_ISA_AES (aarch64_isa_flags & AARCH64_FL_AES) |
254 | #define AARCH64_ISA_SHA2 (aarch64_isa_flags & AARCH64_FL_SHA2) | |
255 | #define AARCH64_ISA_V8_4 (aarch64_isa_flags & AARCH64_FL_V8_4) | |
256 | #define AARCH64_ISA_SM4 (aarch64_isa_flags & AARCH64_FL_SM4) | |
257 | #define AARCH64_ISA_SHA3 (aarch64_isa_flags & AARCH64_FL_SHA3) | |
258 | #define AARCH64_ISA_F16FML (aarch64_isa_flags & AARCH64_FL_F16FML) | |
3c5af608 | 259 | #define AARCH64_ISA_RCPC8_4 (aarch64_isa_flags & AARCH64_FL_RCPC8_4) |
c5dc215d | 260 | #define AARCH64_ISA_RNG (aarch64_isa_flags & AARCH64_FL_RNG) |
59beeb62 | 261 | #define AARCH64_ISA_V8_5 (aarch64_isa_flags & AARCH64_FL_V8_5) |
89626179 | 262 | #define AARCH64_ISA_TME (aarch64_isa_flags & AARCH64_FL_TME) |
ef01e6bb | 263 | #define AARCH64_ISA_MEMTAG (aarch64_isa_flags & AARCH64_FL_MEMTAG) |
a93e1d5c DZ |
264 | #define AARCH64_ISA_V8_6 (aarch64_isa_flags & AARCH64_FL_V8_6) |
265 | #define AARCH64_ISA_I8MM (aarch64_isa_flags & AARCH64_FL_I8MM) | |
266 | #define AARCH64_ISA_BF16 (aarch64_isa_flags & AARCH64_FL_BF16) | |
43e9d192 | 267 | |
683e3333 KT |
268 | /* Crypto is an optional extension to AdvSIMD. */ |
269 | #define TARGET_CRYPTO (TARGET_SIMD && AARCH64_ISA_CRYPTO) | |
43e9d192 | 270 | |
27086ea3 MC |
271 | /* SHA2 is an optional extension to AdvSIMD. */ |
272 | #define TARGET_SHA2 ((TARGET_SIMD && AARCH64_ISA_SHA2) || TARGET_CRYPTO) | |
273 | ||
274 | /* SHA3 is an optional extension to AdvSIMD. */ | |
275 | #define TARGET_SHA3 (TARGET_SIMD && AARCH64_ISA_SHA3) | |
276 | ||
277 | /* AES is an optional extension to AdvSIMD. */ | |
278 | #define TARGET_AES ((TARGET_SIMD && AARCH64_ISA_AES) || TARGET_CRYPTO) | |
279 | ||
280 | /* SM is an optional extension to AdvSIMD. */ | |
281 | #define TARGET_SM4 (TARGET_SIMD && AARCH64_ISA_SM4) | |
282 | ||
283 | /* FP16FML is an optional extension to AdvSIMD. */ | |
284 | #define TARGET_F16FML (TARGET_SIMD && AARCH64_ISA_F16FML && TARGET_FP_F16INST) | |
285 | ||
5d357f26 KT |
286 | /* CRC instructions that can be enabled through +crc arch extension. */ |
287 | #define TARGET_CRC32 (AARCH64_ISA_CRC) | |
288 | ||
045c2d32 MW |
289 | /* Atomic instructions that can be enabled through the +lse extension. */ |
290 | #define TARGET_LSE (AARCH64_ISA_LSE) | |
291 | ||
c61465bd MW |
292 | /* ARMv8.2-A FP16 support that can be enabled through the +fp16 extension. */ |
293 | #define TARGET_FP_F16INST (TARGET_FLOAT && AARCH64_ISA_F16) | |
294 | #define TARGET_SIMD_F16INST (TARGET_SIMD && AARCH64_ISA_F16) | |
295 | ||
1ddc47c0 TC |
296 | /* Dot Product is an optional extension to AdvSIMD enabled through +dotprod. */ |
297 | #define TARGET_DOTPROD (TARGET_SIMD && AARCH64_ISA_DOTPROD) | |
298 | ||
43cacb12 RS |
299 | /* SVE instructions, enabled through +sve. */ |
300 | #define TARGET_SVE (AARCH64_ISA_SVE) | |
301 | ||
0617e23c AM |
302 | /* SVE2 instructions, enabled through +sve2. */ |
303 | #define TARGET_SVE2 (AARCH64_ISA_SVE2) | |
304 | ||
d766c52b JW |
305 | /* ARMv8.3-A features. */ |
306 | #define TARGET_ARMV8_3 (AARCH64_ISA_V8_3) | |
307 | ||
e1d5d19e KT |
308 | /* Javascript conversion instruction from Armv8.3-a. */ |
309 | #define TARGET_JSCVT (TARGET_FLOAT && AARCH64_ISA_V8_3) | |
310 | ||
9d63f43b TC |
311 | /* Armv8.3-a Complex number extension to AdvSIMD extensions. */ |
312 | #define TARGET_COMPLEX (TARGET_SIMD && TARGET_ARMV8_3) | |
313 | ||
10bd1d96 KT |
314 | /* Floating-point rounding instructions from Armv8.5-a. */ |
315 | #define TARGET_FRINT (AARCH64_ISA_V8_5 && TARGET_FLOAT) | |
316 | ||
89626179 SD |
317 | /* TME instructions are enabled. */ |
318 | #define TARGET_TME (AARCH64_ISA_TME) | |
319 | ||
c5dc215d KT |
320 | /* Random number instructions from Armv8.5-a. */ |
321 | #define TARGET_RNG (AARCH64_ISA_RNG) | |
322 | ||
ef01e6bb DZ |
323 | /* Memory Tagging instructions optional to Armv8.5 enabled through +memtag. */ |
324 | #define TARGET_MEMTAG (AARCH64_ISA_V8_5 && AARCH64_ISA_MEMTAG) | |
325 | ||
a93e1d5c DZ |
326 | /* I8MM instructions are enabled through +i8mm. */ |
327 | #define TARGET_I8MM (AARCH64_ISA_I8MM) | |
328 | ||
329 | /* BF16 instructions are enabled through +bf16. */ | |
330 | #define TARGET_BF16_FP (AARCH64_ISA_BF16) | |
331 | #define TARGET_BF16_SIMD (AARCH64_ISA_BF16 && TARGET_SIMD) | |
332 | ||
b32c1043 KT |
333 | /* Make sure this is always defined so we don't have to check for ifdefs |
334 | but rather use normal ifs. */ | |
335 | #ifndef TARGET_FIX_ERR_A53_835769_DEFAULT | |
336 | #define TARGET_FIX_ERR_A53_835769_DEFAULT 0 | |
337 | #else | |
338 | #undef TARGET_FIX_ERR_A53_835769_DEFAULT | |
339 | #define TARGET_FIX_ERR_A53_835769_DEFAULT 1 | |
340 | #endif | |
341 | ||
342 | /* Apply the workaround for Cortex-A53 erratum 835769. */ | |
343 | #define TARGET_FIX_ERR_A53_835769 \ | |
344 | ((aarch64_fix_a53_err835769 == 2) \ | |
345 | ? TARGET_FIX_ERR_A53_835769_DEFAULT : aarch64_fix_a53_err835769) | |
346 | ||
48bb1a55 CL |
347 | /* Make sure this is always defined so we don't have to check for ifdefs |
348 | but rather use normal ifs. */ | |
349 | #ifndef TARGET_FIX_ERR_A53_843419_DEFAULT | |
350 | #define TARGET_FIX_ERR_A53_843419_DEFAULT 0 | |
351 | #else | |
352 | #undef TARGET_FIX_ERR_A53_843419_DEFAULT | |
353 | #define TARGET_FIX_ERR_A53_843419_DEFAULT 1 | |
354 | #endif | |
355 | ||
356 | /* Apply the workaround for Cortex-A53 erratum 843419. */ | |
357 | #define TARGET_FIX_ERR_A53_843419 \ | |
358 | ((aarch64_fix_a53_err843419 == 2) \ | |
359 | ? TARGET_FIX_ERR_A53_843419_DEFAULT : aarch64_fix_a53_err843419) | |
360 | ||
74bb9de4 | 361 | /* ARMv8.1-A Adv.SIMD support. */ |
a3735e01 MW |
362 | #define TARGET_SIMD_RDMA (TARGET_SIMD && AARCH64_ISA_RDMA) |
363 | ||
43e9d192 IB |
364 | /* Standard register usage. */ |
365 | ||
366 | /* 31 64-bit general purpose registers R0-R30: | |
367 | R30 LR (link register) | |
368 | R29 FP (frame pointer) | |
369 | R19-R28 Callee-saved registers | |
370 | R18 The platform register; use as temporary register. | |
371 | R17 IP1 The second intra-procedure-call temporary register | |
372 | (can be used by call veneers and PLT code); otherwise use | |
373 | as a temporary register | |
374 | R16 IP0 The first intra-procedure-call temporary register (can | |
375 | be used by call veneers and PLT code); otherwise use as a | |
376 | temporary register | |
377 | R9-R15 Temporary registers | |
378 | R8 Structure value parameter / temporary register | |
379 | R0-R7 Parameter/result registers | |
380 | ||
381 | SP stack pointer, encoded as X/R31 where permitted. | |
382 | ZR zero register, encoded as X/R31 elsewhere | |
383 | ||
384 | 32 x 128-bit floating-point/vector registers | |
385 | V16-V31 Caller-saved (temporary) registers | |
386 | V8-V15 Callee-saved registers | |
387 | V0-V7 Parameter/result registers | |
388 | ||
389 | The vector register V0 holds scalar B0, H0, S0 and D0 in its least | |
43cacb12 RS |
390 | significant bits. Unlike AArch32 S1 is not packed into D0, etc. |
391 | ||
392 | P0-P7 Predicate low registers: valid in all predicate contexts | |
393 | P8-P15 Predicate high registers: used as scratch space | |
394 | ||
183bfdaf RS |
395 | FFR First Fault Register, a fixed-use SVE predicate register |
396 | FFRT FFR token: a fake register used for modelling dependencies | |
397 | ||
43cacb12 RS |
398 | VG Pseudo "vector granules" register |
399 | ||
400 | VG is the number of 64-bit elements in an SVE vector. We define | |
401 | it as a hard register so that we can easily map it to the DWARF VG | |
402 | register. GCC internally uses the poly_int variable aarch64_sve_vg | |
403 | instead. */ | |
43e9d192 | 404 | |
43e9d192 IB |
405 | #define FIXED_REGISTERS \ |
406 | { \ | |
407 | 0, 0, 0, 0, 0, 0, 0, 0, /* R0 - R7 */ \ | |
408 | 0, 0, 0, 0, 0, 0, 0, 0, /* R8 - R15 */ \ | |
409 | 0, 0, 0, 0, 0, 0, 0, 0, /* R16 - R23 */ \ | |
410 | 0, 0, 0, 0, 0, 1, 0, 1, /* R24 - R30, SP */ \ | |
411 | 0, 0, 0, 0, 0, 0, 0, 0, /* V0 - V7 */ \ | |
412 | 0, 0, 0, 0, 0, 0, 0, 0, /* V8 - V15 */ \ | |
413 | 0, 0, 0, 0, 0, 0, 0, 0, /* V16 - V23 */ \ | |
414 | 0, 0, 0, 0, 0, 0, 0, 0, /* V24 - V31 */ \ | |
43cacb12 RS |
415 | 1, 1, 1, 1, /* SFP, AP, CC, VG */ \ |
416 | 0, 0, 0, 0, 0, 0, 0, 0, /* P0 - P7 */ \ | |
417 | 0, 0, 0, 0, 0, 0, 0, 0, /* P8 - P15 */ \ | |
183bfdaf | 418 | 1, 1 /* FFR and FFRT */ \ |
43e9d192 IB |
419 | } |
420 | ||
643ef957 SP |
421 | /* X30 is marked as caller-saved which is in line with regular function call |
422 | behavior since the call instructions clobber it; AARCH64_EXPAND_CALL does | |
423 | that for regular function calls and avoids it for sibcalls. X30 is | |
424 | considered live for sibcalls; EPILOGUE_USES helps achieve that by returning | |
425 | true but not until function epilogues have been generated. This ensures | |
426 | that X30 is available for use in leaf functions if needed. */ | |
427 | ||
43e9d192 IB |
428 | #define CALL_USED_REGISTERS \ |
429 | { \ | |
430 | 1, 1, 1, 1, 1, 1, 1, 1, /* R0 - R7 */ \ | |
431 | 1, 1, 1, 1, 1, 1, 1, 1, /* R8 - R15 */ \ | |
432 | 1, 1, 1, 0, 0, 0, 0, 0, /* R16 - R23 */ \ | |
1c923b60 | 433 | 0, 0, 0, 0, 0, 1, 1, 1, /* R24 - R30, SP */ \ |
43e9d192 IB |
434 | 1, 1, 1, 1, 1, 1, 1, 1, /* V0 - V7 */ \ |
435 | 0, 0, 0, 0, 0, 0, 0, 0, /* V8 - V15 */ \ | |
436 | 1, 1, 1, 1, 1, 1, 1, 1, /* V16 - V23 */ \ | |
437 | 1, 1, 1, 1, 1, 1, 1, 1, /* V24 - V31 */ \ | |
43cacb12 RS |
438 | 1, 1, 1, 1, /* SFP, AP, CC, VG */ \ |
439 | 1, 1, 1, 1, 1, 1, 1, 1, /* P0 - P7 */ \ | |
440 | 1, 1, 1, 1, 1, 1, 1, 1, /* P8 - P15 */ \ | |
183bfdaf | 441 | 1, 1 /* FFR and FFRT */ \ |
43e9d192 IB |
442 | } |
443 | ||
444 | #define REGISTER_NAMES \ | |
445 | { \ | |
446 | "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", \ | |
447 | "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", \ | |
448 | "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", \ | |
449 | "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", \ | |
450 | "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", \ | |
451 | "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", \ | |
452 | "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", \ | |
453 | "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", \ | |
43cacb12 RS |
454 | "sfp", "ap", "cc", "vg", \ |
455 | "p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7", \ | |
456 | "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15", \ | |
183bfdaf | 457 | "ffr", "ffrt" \ |
43e9d192 IB |
458 | } |
459 | ||
460 | /* Generate the register aliases for core register N */ | |
461 | #define R_ALIASES(N) {"r" # N, R0_REGNUM + (N)}, \ | |
462 | {"w" # N, R0_REGNUM + (N)} | |
463 | ||
464 | #define V_ALIASES(N) {"q" # N, V0_REGNUM + (N)}, \ | |
465 | {"d" # N, V0_REGNUM + (N)}, \ | |
466 | {"s" # N, V0_REGNUM + (N)}, \ | |
467 | {"h" # N, V0_REGNUM + (N)}, \ | |
43cacb12 RS |
468 | {"b" # N, V0_REGNUM + (N)}, \ |
469 | {"z" # N, V0_REGNUM + (N)} | |
43e9d192 IB |
470 | |
471 | /* Provide aliases for all of the ISA defined register name forms. | |
472 | These aliases are convenient for use in the clobber lists of inline | |
473 | asm statements. */ | |
474 | ||
475 | #define ADDITIONAL_REGISTER_NAMES \ | |
476 | { R_ALIASES(0), R_ALIASES(1), R_ALIASES(2), R_ALIASES(3), \ | |
477 | R_ALIASES(4), R_ALIASES(5), R_ALIASES(6), R_ALIASES(7), \ | |
478 | R_ALIASES(8), R_ALIASES(9), R_ALIASES(10), R_ALIASES(11), \ | |
479 | R_ALIASES(12), R_ALIASES(13), R_ALIASES(14), R_ALIASES(15), \ | |
480 | R_ALIASES(16), R_ALIASES(17), R_ALIASES(18), R_ALIASES(19), \ | |
481 | R_ALIASES(20), R_ALIASES(21), R_ALIASES(22), R_ALIASES(23), \ | |
482 | R_ALIASES(24), R_ALIASES(25), R_ALIASES(26), R_ALIASES(27), \ | |
9259db42 | 483 | R_ALIASES(28), R_ALIASES(29), R_ALIASES(30), {"wsp", R0_REGNUM + 31}, \ |
43e9d192 IB |
484 | V_ALIASES(0), V_ALIASES(1), V_ALIASES(2), V_ALIASES(3), \ |
485 | V_ALIASES(4), V_ALIASES(5), V_ALIASES(6), V_ALIASES(7), \ | |
486 | V_ALIASES(8), V_ALIASES(9), V_ALIASES(10), V_ALIASES(11), \ | |
487 | V_ALIASES(12), V_ALIASES(13), V_ALIASES(14), V_ALIASES(15), \ | |
488 | V_ALIASES(16), V_ALIASES(17), V_ALIASES(18), V_ALIASES(19), \ | |
489 | V_ALIASES(20), V_ALIASES(21), V_ALIASES(22), V_ALIASES(23), \ | |
490 | V_ALIASES(24), V_ALIASES(25), V_ALIASES(26), V_ALIASES(27), \ | |
491 | V_ALIASES(28), V_ALIASES(29), V_ALIASES(30), V_ALIASES(31) \ | |
492 | } | |
493 | ||
a0d0b980 | 494 | #define EPILOGUE_USES(REGNO) (aarch64_epilogue_uses (REGNO)) |
43e9d192 IB |
495 | |
496 | /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, | |
204d2c03 WD |
497 | the stack pointer does not matter. This is only true if the function |
498 | uses alloca. */ | |
499 | #define EXIT_IGNORE_STACK (cfun->calls_alloca) | |
43e9d192 IB |
500 | |
501 | #define STATIC_CHAIN_REGNUM R18_REGNUM | |
502 | #define HARD_FRAME_POINTER_REGNUM R29_REGNUM | |
503 | #define FRAME_POINTER_REGNUM SFP_REGNUM | |
504 | #define STACK_POINTER_REGNUM SP_REGNUM | |
505 | #define ARG_POINTER_REGNUM AP_REGNUM | |
183bfdaf | 506 | #define FIRST_PSEUDO_REGISTER (FFRT_REGNUM + 1) |
43e9d192 | 507 | |
c600df9a | 508 | /* The number of argument registers available for each class. */ |
43e9d192 IB |
509 | #define NUM_ARG_REGS 8 |
510 | #define NUM_FP_ARG_REGS 8 | |
c600df9a | 511 | #define NUM_PR_ARG_REGS 4 |
43e9d192 IB |
512 | |
513 | /* A Homogeneous Floating-Point or Short-Vector Aggregate may have at most | |
514 | four members. */ | |
515 | #define HA_MAX_NUM_FLDS 4 | |
516 | ||
517 | /* External dwarf register number scheme. These number are used to | |
518 | identify registers in dwarf debug information, the values are | |
519 | defined by the AArch64 ABI. The numbering scheme is independent of | |
520 | GCC's internal register numbering scheme. */ | |
521 | ||
522 | #define AARCH64_DWARF_R0 0 | |
523 | ||
524 | /* The number of R registers, note 31! not 32. */ | |
525 | #define AARCH64_DWARF_NUMBER_R 31 | |
526 | ||
527 | #define AARCH64_DWARF_SP 31 | |
43cacb12 RS |
528 | #define AARCH64_DWARF_VG 46 |
529 | #define AARCH64_DWARF_P0 48 | |
43e9d192 IB |
530 | #define AARCH64_DWARF_V0 64 |
531 | ||
532 | /* The number of V registers. */ | |
533 | #define AARCH64_DWARF_NUMBER_V 32 | |
534 | ||
535 | /* For signal frames we need to use an alternative return column. This | |
536 | value must not correspond to a hard register and must be out of the | |
537 | range of DWARF_FRAME_REGNUM(). */ | |
538 | #define DWARF_ALT_FRAME_RETURN_COLUMN \ | |
539 | (AARCH64_DWARF_V0 + AARCH64_DWARF_NUMBER_V) | |
540 | ||
541 | /* We add 1 extra frame register for use as the | |
542 | DWARF_ALT_FRAME_RETURN_COLUMN. */ | |
543 | #define DWARF_FRAME_REGISTERS (DWARF_ALT_FRAME_RETURN_COLUMN + 1) | |
544 | ||
545 | ||
546 | #define DBX_REGISTER_NUMBER(REGNO) aarch64_dbx_register_number (REGNO) | |
547 | /* Provide a definition of DWARF_FRAME_REGNUM here so that fallback unwinders | |
548 | can use DWARF_ALT_FRAME_RETURN_COLUMN defined below. This is just the same | |
549 | as the default definition in dwarf2out.c. */ | |
550 | #undef DWARF_FRAME_REGNUM | |
551 | #define DWARF_FRAME_REGNUM(REGNO) DBX_REGISTER_NUMBER (REGNO) | |
552 | ||
553 | #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (LR_REGNUM) | |
554 | ||
43e9d192 IB |
555 | #define DWARF2_UNWIND_INFO 1 |
556 | ||
557 | /* Use R0 through R3 to pass exception handling information. */ | |
558 | #define EH_RETURN_DATA_REGNO(N) \ | |
559 | ((N) < 4 ? ((unsigned int) R0_REGNUM + (N)) : INVALID_REGNUM) | |
560 | ||
561 | /* Select a format to encode pointers in exception handling data. */ | |
562 | #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ | |
563 | aarch64_asm_preferred_eh_data_format ((CODE), (GLOBAL)) | |
564 | ||
361fb3ee KT |
565 | /* Output the assembly strings we want to add to a function definition. */ |
566 | #define ASM_DECLARE_FUNCTION_NAME(STR, NAME, DECL) \ | |
567 | aarch64_declare_function_name (STR, NAME, DECL) | |
568 | ||
b07fc91c SN |
569 | /* Output assembly strings for alias definition. */ |
570 | #define ASM_OUTPUT_DEF_FROM_DECLS(STR, DECL, TARGET) \ | |
571 | aarch64_asm_output_alias (STR, DECL, TARGET) | |
572 | ||
573 | /* Output assembly strings for undefined extern symbols. */ | |
574 | #undef ASM_OUTPUT_EXTERNAL | |
575 | #define ASM_OUTPUT_EXTERNAL(STR, DECL, NAME) \ | |
576 | aarch64_asm_output_external (STR, DECL, NAME) | |
577 | ||
8fc16d72 ST |
578 | /* Output assembly strings after .cfi_startproc is emitted. */ |
579 | #define ASM_POST_CFI_STARTPROC aarch64_post_cfi_startproc | |
580 | ||
8144a493 WD |
581 | /* For EH returns X4 contains the stack adjustment. */ |
582 | #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, R4_REGNUM) | |
583 | #define EH_RETURN_HANDLER_RTX aarch64_eh_return_handler_rtx () | |
43e9d192 IB |
584 | |
585 | /* Don't use __builtin_setjmp until we've defined it. */ | |
586 | #undef DONT_USE_BUILTIN_SETJMP | |
587 | #define DONT_USE_BUILTIN_SETJMP 1 | |
588 | ||
0795f659 VL |
589 | #undef TARGET_COMPUTE_FRAME_LAYOUT |
590 | #define TARGET_COMPUTE_FRAME_LAYOUT aarch64_layout_frame | |
591 | ||
43e9d192 IB |
592 | /* Register in which the structure value is to be returned. */ |
593 | #define AARCH64_STRUCT_VALUE_REGNUM R8_REGNUM | |
594 | ||
595 | /* Non-zero if REGNO is part of the Core register set. | |
596 | ||
597 | The rather unusual way of expressing this check is to avoid | |
598 | warnings when building the compiler when R0_REGNUM is 0 and REGNO | |
599 | is unsigned. */ | |
600 | #define GP_REGNUM_P(REGNO) \ | |
601 | (((unsigned) (REGNO - R0_REGNUM)) <= (R30_REGNUM - R0_REGNUM)) | |
602 | ||
603 | #define FP_REGNUM_P(REGNO) \ | |
604 | (((unsigned) (REGNO - V0_REGNUM)) <= (V31_REGNUM - V0_REGNUM)) | |
605 | ||
606 | #define FP_LO_REGNUM_P(REGNO) \ | |
607 | (((unsigned) (REGNO - V0_REGNUM)) <= (V15_REGNUM - V0_REGNUM)) | |
608 | ||
163b1f6a RS |
609 | #define FP_LO8_REGNUM_P(REGNO) \ |
610 | (((unsigned) (REGNO - V0_REGNUM)) <= (V7_REGNUM - V0_REGNUM)) | |
611 | ||
43cacb12 RS |
612 | #define PR_REGNUM_P(REGNO)\ |
613 | (((unsigned) (REGNO - P0_REGNUM)) <= (P15_REGNUM - P0_REGNUM)) | |
614 | ||
615 | #define PR_LO_REGNUM_P(REGNO)\ | |
616 | (((unsigned) (REGNO - P0_REGNUM)) <= (P7_REGNUM - P0_REGNUM)) | |
617 | ||
a0d0b980 SE |
618 | #define FP_SIMD_SAVED_REGNUM_P(REGNO) \ |
619 | (((unsigned) (REGNO - V8_REGNUM)) <= (V23_REGNUM - V8_REGNUM)) | |
43e9d192 IB |
620 | \f |
621 | /* Register and constant classes. */ | |
622 | ||
623 | enum reg_class | |
624 | { | |
625 | NO_REGS, | |
d677263e | 626 | TAILCALL_ADDR_REGS, |
43e9d192 IB |
627 | GENERAL_REGS, |
628 | STACK_REG, | |
629 | POINTER_REGS, | |
163b1f6a | 630 | FP_LO8_REGS, |
43e9d192 IB |
631 | FP_LO_REGS, |
632 | FP_REGS, | |
f25a140b | 633 | POINTER_AND_FP_REGS, |
43cacb12 RS |
634 | PR_LO_REGS, |
635 | PR_HI_REGS, | |
636 | PR_REGS, | |
183bfdaf RS |
637 | FFR_REGS, |
638 | PR_AND_FFR_REGS, | |
43e9d192 IB |
639 | ALL_REGS, |
640 | LIM_REG_CLASSES /* Last */ | |
641 | }; | |
642 | ||
643 | #define N_REG_CLASSES ((int) LIM_REG_CLASSES) | |
644 | ||
645 | #define REG_CLASS_NAMES \ | |
646 | { \ | |
647 | "NO_REGS", \ | |
d677263e | 648 | "TAILCALL_ADDR_REGS", \ |
43e9d192 IB |
649 | "GENERAL_REGS", \ |
650 | "STACK_REG", \ | |
651 | "POINTER_REGS", \ | |
163b1f6a | 652 | "FP_LO8_REGS", \ |
43e9d192 IB |
653 | "FP_LO_REGS", \ |
654 | "FP_REGS", \ | |
f25a140b | 655 | "POINTER_AND_FP_REGS", \ |
43cacb12 RS |
656 | "PR_LO_REGS", \ |
657 | "PR_HI_REGS", \ | |
658 | "PR_REGS", \ | |
183bfdaf RS |
659 | "FFR_REGS", \ |
660 | "PR_AND_FFR_REGS", \ | |
43e9d192 IB |
661 | "ALL_REGS" \ |
662 | } | |
663 | ||
664 | #define REG_CLASS_CONTENTS \ | |
665 | { \ | |
666 | { 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \ | |
901e66e0 | 667 | { 0x00030000, 0x00000000, 0x00000000 }, /* TAILCALL_ADDR_REGS */\ |
43e9d192 IB |
668 | { 0x7fffffff, 0x00000000, 0x00000003 }, /* GENERAL_REGS */ \ |
669 | { 0x80000000, 0x00000000, 0x00000000 }, /* STACK_REG */ \ | |
670 | { 0xffffffff, 0x00000000, 0x00000003 }, /* POINTER_REGS */ \ | |
163b1f6a | 671 | { 0x00000000, 0x000000ff, 0x00000000 }, /* FP_LO8_REGS */ \ |
43e9d192 IB |
672 | { 0x00000000, 0x0000ffff, 0x00000000 }, /* FP_LO_REGS */ \ |
673 | { 0x00000000, 0xffffffff, 0x00000000 }, /* FP_REGS */ \ | |
f25a140b | 674 | { 0xffffffff, 0xffffffff, 0x00000003 }, /* POINTER_AND_FP_REGS */\ |
43cacb12 RS |
675 | { 0x00000000, 0x00000000, 0x00000ff0 }, /* PR_LO_REGS */ \ |
676 | { 0x00000000, 0x00000000, 0x000ff000 }, /* PR_HI_REGS */ \ | |
677 | { 0x00000000, 0x00000000, 0x000ffff0 }, /* PR_REGS */ \ | |
183bfdaf RS |
678 | { 0x00000000, 0x00000000, 0x00300000 }, /* FFR_REGS */ \ |
679 | { 0x00000000, 0x00000000, 0x003ffff0 }, /* PR_AND_FFR_REGS */ \ | |
43cacb12 | 680 | { 0xffffffff, 0xffffffff, 0x000fffff } /* ALL_REGS */ \ |
43e9d192 IB |
681 | } |
682 | ||
683 | #define REGNO_REG_CLASS(REGNO) aarch64_regno_regclass (REGNO) | |
684 | ||
a4a182c6 | 685 | #define INDEX_REG_CLASS GENERAL_REGS |
43e9d192 IB |
686 | #define BASE_REG_CLASS POINTER_REGS |
687 | ||
6991c977 | 688 | /* Register pairs used to eliminate unneeded registers that point into |
43e9d192 IB |
689 | the stack frame. */ |
690 | #define ELIMINABLE_REGS \ | |
691 | { \ | |
692 | { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ | |
693 | { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM }, \ | |
694 | { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ | |
695 | { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM }, \ | |
696 | } | |
697 | ||
698 | #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ | |
699 | (OFFSET) = aarch64_initial_elimination_offset (FROM, TO) | |
700 | ||
701 | /* CPU/ARCH option handling. */ | |
702 | #include "config/aarch64/aarch64-opts.h" | |
703 | ||
704 | enum target_cpus | |
705 | { | |
e8fcc9fa | 706 | #define AARCH64_CORE(NAME, INTERNAL_IDENT, SCHED, ARCH, FLAGS, COSTS, IMP, PART, VARIANT) \ |
192ed1dd | 707 | TARGET_CPU_##INTERNAL_IDENT, |
43e9d192 | 708 | #include "aarch64-cores.def" |
43e9d192 IB |
709 | TARGET_CPU_generic |
710 | }; | |
711 | ||
a3cd0246 | 712 | /* If there is no CPU defined at configure, use generic as default. */ |
43e9d192 IB |
713 | #ifndef TARGET_CPU_DEFAULT |
714 | #define TARGET_CPU_DEFAULT \ | |
a3cd0246 | 715 | (TARGET_CPU_generic | (AARCH64_CPU_DEFAULT_FLAGS << 6)) |
43e9d192 IB |
716 | #endif |
717 | ||
75cf1494 KT |
718 | /* If inserting NOP before a mult-accumulate insn remember to adjust the |
719 | length so that conditional branching code is updated appropriately. */ | |
720 | #define ADJUST_INSN_LENGTH(insn, length) \ | |
8baff86e KT |
721 | do \ |
722 | { \ | |
723 | if (aarch64_madd_needs_nop (insn)) \ | |
724 | length += 4; \ | |
725 | } while (0) | |
75cf1494 KT |
726 | |
727 | #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \ | |
728 | aarch64_final_prescan_insn (INSN); \ | |
729 | ||
43e9d192 IB |
730 | /* The processor for which instructions should be scheduled. */ |
731 | extern enum aarch64_processor aarch64_tune; | |
732 | ||
733 | /* RTL generation support. */ | |
734 | #define INIT_EXPANDERS aarch64_init_expanders () | |
735 | \f | |
736 | ||
737 | /* Stack layout; function entry, exit and calling. */ | |
738 | #define STACK_GROWS_DOWNWARD 1 | |
739 | ||
6991c977 | 740 | #define FRAME_GROWS_DOWNWARD 1 |
43e9d192 | 741 | |
43e9d192 IB |
742 | #define ACCUMULATE_OUTGOING_ARGS 1 |
743 | ||
744 | #define FIRST_PARM_OFFSET(FNDECL) 0 | |
745 | ||
746 | /* Fix for VFP */ | |
747 | #define LIBCALL_VALUE(MODE) \ | |
748 | gen_rtx_REG (MODE, FLOAT_MODE_P (MODE) ? V0_REGNUM : R0_REGNUM) | |
749 | ||
750 | #define DEFAULT_PCC_STRUCT_RETURN 0 | |
751 | ||
6a70badb | 752 | #ifdef HAVE_POLY_INT_H |
43e9d192 IB |
753 | struct GTY (()) aarch64_frame |
754 | { | |
c600df9a | 755 | poly_int64 reg_offset[LAST_SAVED_REGNUM + 1]; |
8799637a MS |
756 | |
757 | /* The number of extra stack bytes taken up by register varargs. | |
758 | This area is allocated by the callee at the very top of the | |
759 | frame. This value is rounded up to a multiple of | |
760 | STACK_BOUNDARY. */ | |
761 | HOST_WIDE_INT saved_varargs_size; | |
762 | ||
c600df9a RS |
763 | /* The size of the callee-save registers with a slot in REG_OFFSET. */ |
764 | poly_int64 saved_regs_size; | |
71bfb77a | 765 | |
c600df9a RS |
766 | /* The size of the callee-save registers with a slot in REG_OFFSET that |
767 | are saved below the hard frame pointer. */ | |
768 | poly_int64 below_hard_fp_saved_regs_size; | |
71bfb77a WD |
769 | |
770 | /* Offset from the base of the frame (incomming SP) to the | |
771 | top of the locals area. This value is always a multiple of | |
772 | STACK_BOUNDARY. */ | |
6a70badb | 773 | poly_int64 locals_offset; |
43e9d192 | 774 | |
1c960e02 MS |
775 | /* Offset from the base of the frame (incomming SP) to the |
776 | hard_frame_pointer. This value is always a multiple of | |
777 | STACK_BOUNDARY. */ | |
6a70badb | 778 | poly_int64 hard_fp_offset; |
1c960e02 MS |
779 | |
780 | /* The size of the frame. This value is the offset from base of the | |
6a70badb RS |
781 | frame (incomming SP) to the stack_pointer. This value is always |
782 | a multiple of STACK_BOUNDARY. */ | |
783 | poly_int64 frame_size; | |
71bfb77a WD |
784 | |
785 | /* The size of the initial stack adjustment before saving callee-saves. */ | |
6a70badb | 786 | poly_int64 initial_adjust; |
71bfb77a WD |
787 | |
788 | /* The writeback value when pushing callee-save registers. | |
789 | It is zero when no push is used. */ | |
790 | HOST_WIDE_INT callee_adjust; | |
791 | ||
792 | /* The offset from SP to the callee-save registers after initial_adjust. | |
793 | It may be non-zero if no push is used (ie. callee_adjust == 0). */ | |
6a70badb | 794 | poly_int64 callee_offset; |
71bfb77a | 795 | |
c600df9a RS |
796 | /* The size of the stack adjustment before saving or after restoring |
797 | SVE registers. */ | |
798 | poly_int64 sve_callee_adjust; | |
799 | ||
71bfb77a | 800 | /* The size of the stack adjustment after saving callee-saves. */ |
6a70badb | 801 | poly_int64 final_adjust; |
1c960e02 | 802 | |
204d2c03 WD |
803 | /* Store FP,LR and setup a frame pointer. */ |
804 | bool emit_frame_chain; | |
805 | ||
363ffa50 JW |
806 | unsigned wb_candidate1; |
807 | unsigned wb_candidate2; | |
808 | ||
c600df9a RS |
809 | /* Big-endian SVE frames need a spare predicate register in order |
810 | to save vector registers in the correct layout for unwinding. | |
811 | This is the register they should use. */ | |
812 | unsigned spare_pred_reg; | |
813 | ||
43e9d192 IB |
814 | bool laid_out; |
815 | }; | |
816 | ||
817 | typedef struct GTY (()) machine_function | |
818 | { | |
819 | struct aarch64_frame frame; | |
827ab47a KT |
820 | /* One entry for each hard register. */ |
821 | bool reg_is_wrapped_separately[LAST_SAVED_REGNUM]; | |
43e9d192 IB |
822 | } machine_function; |
823 | #endif | |
824 | ||
17a819cb YZ |
825 | /* Which ABI to use. */ |
826 | enum aarch64_abi_type | |
827 | { | |
828 | AARCH64_ABI_LP64 = 0, | |
829 | AARCH64_ABI_ILP32 = 1 | |
830 | }; | |
831 | ||
832 | #ifndef AARCH64_ABI_DEFAULT | |
833 | #define AARCH64_ABI_DEFAULT AARCH64_ABI_LP64 | |
834 | #endif | |
835 | ||
836 | #define TARGET_ILP32 (aarch64_abi & AARCH64_ABI_ILP32) | |
43e9d192 | 837 | |
43e9d192 IB |
838 | enum arm_pcs |
839 | { | |
840 | ARM_PCS_AAPCS64, /* Base standard AAPCS for 64 bit. */ | |
002ffd3c | 841 | ARM_PCS_SIMD, /* For aarch64_vector_pcs functions. */ |
c600df9a RS |
842 | ARM_PCS_SVE, /* For functions that pass or return |
843 | values in SVE registers. */ | |
bb6ce448 | 844 | ARM_PCS_TLSDESC, /* For targets of tlsdesc calls. */ |
43e9d192 IB |
845 | ARM_PCS_UNKNOWN |
846 | }; | |
847 | ||
848 | ||
43e9d192 | 849 | |
43e9d192 | 850 | |
ef4bddc2 | 851 | /* We can't use machine_mode inside a generator file because it |
43e9d192 IB |
852 | hasn't been created yet; we shouldn't be using any code that |
853 | needs the real definition though, so this ought to be safe. */ | |
854 | #ifdef GENERATOR_FILE | |
855 | #define MACHMODE int | |
856 | #else | |
857 | #include "insn-modes.h" | |
febd3244 | 858 | #define MACHMODE machine_mode |
43e9d192 IB |
859 | #endif |
860 | ||
febd3244 | 861 | #ifndef USED_FOR_TARGET |
43e9d192 IB |
862 | /* AAPCS related state tracking. */ |
863 | typedef struct | |
864 | { | |
865 | enum arm_pcs pcs_variant; | |
866 | int aapcs_arg_processed; /* No need to lay out this argument again. */ | |
867 | int aapcs_ncrn; /* Next Core register number. */ | |
868 | int aapcs_nextncrn; /* Next next core register number. */ | |
869 | int aapcs_nvrn; /* Next Vector register number. */ | |
870 | int aapcs_nextnvrn; /* Next Next Vector register number. */ | |
c600df9a RS |
871 | int aapcs_nprn; /* Next Predicate register number. */ |
872 | int aapcs_nextnprn; /* Next Next Predicate register number. */ | |
43e9d192 IB |
873 | rtx aapcs_reg; /* Register assigned to this argument. This |
874 | is NULL_RTX if this parameter goes on | |
875 | the stack. */ | |
876 | MACHMODE aapcs_vfp_rmode; | |
877 | int aapcs_stack_words; /* If the argument is passed on the stack, this | |
878 | is the number of words needed, after rounding | |
879 | up. Only meaningful when | |
880 | aapcs_reg == NULL_RTX. */ | |
881 | int aapcs_stack_size; /* The total size (in words, per 8 byte) of the | |
882 | stack arg area so far. */ | |
c600df9a RS |
883 | bool silent_p; /* True if we should act silently, rather than |
884 | raise an error for invalid calls. */ | |
43e9d192 | 885 | } CUMULATIVE_ARGS; |
febd3244 | 886 | #endif |
43e9d192 | 887 | |
43e9d192 | 888 | #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \ |
76b0cbf8 | 889 | (aarch64_pad_reg_upward (MODE, TYPE, FIRST) ? PAD_UPWARD : PAD_DOWNWARD) |
43e9d192 IB |
890 | |
891 | #define PAD_VARARGS_DOWN 0 | |
892 | ||
893 | #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ | |
894 | aarch64_init_cumulative_args (&(CUM), FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) | |
895 | ||
896 | #define FUNCTION_ARG_REGNO_P(REGNO) \ | |
897 | aarch64_function_arg_regno_p(REGNO) | |
898 | \f | |
899 | ||
900 | /* ISA Features. */ | |
901 | ||
902 | /* Addressing modes, etc. */ | |
903 | #define HAVE_POST_INCREMENT 1 | |
904 | #define HAVE_PRE_INCREMENT 1 | |
905 | #define HAVE_POST_DECREMENT 1 | |
906 | #define HAVE_PRE_DECREMENT 1 | |
907 | #define HAVE_POST_MODIFY_DISP 1 | |
908 | #define HAVE_PRE_MODIFY_DISP 1 | |
909 | ||
910 | #define MAX_REGS_PER_ADDRESS 2 | |
911 | ||
912 | #define CONSTANT_ADDRESS_P(X) aarch64_constant_address_p(X) | |
913 | ||
43e9d192 IB |
914 | #define REGNO_OK_FOR_BASE_P(REGNO) \ |
915 | aarch64_regno_ok_for_base_p (REGNO, true) | |
916 | ||
917 | #define REGNO_OK_FOR_INDEX_P(REGNO) \ | |
918 | aarch64_regno_ok_for_index_p (REGNO, true) | |
919 | ||
920 | #define LEGITIMATE_PIC_OPERAND_P(X) \ | |
921 | aarch64_legitimate_pic_operand_p (X) | |
922 | ||
923 | #define CASE_VECTOR_MODE Pmode | |
924 | ||
925 | #define DEFAULT_SIGNED_CHAR 0 | |
926 | ||
927 | /* An integer expression for the size in bits of the largest integer machine | |
928 | mode that should actually be used. We allow pairs of registers. */ | |
929 | #define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (TImode) | |
930 | ||
931 | /* Maximum bytes moved by a single instruction (load/store pair). */ | |
932 | #define MOVE_MAX (UNITS_PER_WORD * 2) | |
933 | ||
934 | /* The base cost overhead of a memcpy call, for MOVE_RATIO and friends. */ | |
935 | #define AARCH64_CALL_RATIO 8 | |
936 | ||
e2c75eea JG |
937 | /* MOVE_RATIO dictates when we will use the move_by_pieces infrastructure. |
938 | move_by_pieces will continually copy the largest safe chunks. So a | |
939 | 7-byte copy is a 4-byte + 2-byte + byte copy. This proves inefficient | |
76715c32 | 940 | for both size and speed of copy, so we will instead use the "cpymem" |
e2c75eea JG |
941 | standard name to implement the copy. This logic does not apply when |
942 | targeting -mstrict-align, so keep a sensible default in that case. */ | |
43e9d192 | 943 | #define MOVE_RATIO(speed) \ |
e2c75eea | 944 | (!STRICT_ALIGNMENT ? 2 : (((speed) ? 15 : AARCH64_CALL_RATIO) / 2)) |
43e9d192 IB |
945 | |
946 | /* For CLEAR_RATIO, when optimizing for size, give a better estimate | |
947 | of the length of a memset call, but use the default otherwise. */ | |
948 | #define CLEAR_RATIO(speed) \ | |
949 | ((speed) ? 15 : AARCH64_CALL_RATIO) | |
950 | ||
951 | /* SET_RATIO is similar to CLEAR_RATIO, but for a non-zero constant, so when | |
952 | optimizing for size adjust the ratio to account for the overhead of loading | |
953 | the constant. */ | |
954 | #define SET_RATIO(speed) \ | |
955 | ((speed) ? 15 : AARCH64_CALL_RATIO - 2) | |
956 | ||
43e9d192 IB |
957 | /* Disable auto-increment in move_by_pieces et al. Use of auto-increment is |
958 | rarely a good idea in straight-line code since it adds an extra address | |
959 | dependency between each instruction. Better to use incrementing offsets. */ | |
960 | #define USE_LOAD_POST_INCREMENT(MODE) 0 | |
961 | #define USE_LOAD_POST_DECREMENT(MODE) 0 | |
962 | #define USE_LOAD_PRE_INCREMENT(MODE) 0 | |
963 | #define USE_LOAD_PRE_DECREMENT(MODE) 0 | |
964 | #define USE_STORE_POST_INCREMENT(MODE) 0 | |
965 | #define USE_STORE_POST_DECREMENT(MODE) 0 | |
966 | #define USE_STORE_PRE_INCREMENT(MODE) 0 | |
967 | #define USE_STORE_PRE_DECREMENT(MODE) 0 | |
968 | ||
56c9ef5f KT |
969 | /* WORD_REGISTER_OPERATIONS does not hold for AArch64. |
970 | The assigned word_mode is DImode but operations narrower than SImode | |
971 | behave as 32-bit operations if using the W-form of the registers rather | |
972 | than as word_mode (64-bit) operations as WORD_REGISTER_OPERATIONS | |
973 | expects. */ | |
974 | #define WORD_REGISTER_OPERATIONS 0 | |
43e9d192 IB |
975 | |
976 | /* Define if loading from memory in MODE, an integral mode narrower than | |
977 | BITS_PER_WORD will either zero-extend or sign-extend. The value of this | |
978 | macro should be the code that says which one of the two operations is | |
979 | implicitly done, or UNKNOWN if none. */ | |
980 | #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND | |
981 | ||
982 | /* Define this macro to be non-zero if instructions will fail to work | |
983 | if given data not on the nominal alignment. */ | |
984 | #define STRICT_ALIGNMENT TARGET_STRICT_ALIGN | |
985 | ||
986 | /* Define this macro to be non-zero if accessing less than a word of | |
987 | memory is no faster than accessing a word of memory, i.e., if such | |
988 | accesses require more than one instruction or if there is no | |
989 | difference in cost. | |
990 | Although there's no difference in instruction count or cycles, | |
991 | in AArch64 we don't want to expand to a sub-word to a 64-bit access | |
992 | if we don't have to, for power-saving reasons. */ | |
993 | #define SLOW_BYTE_ACCESS 0 | |
994 | ||
43e9d192 IB |
995 | #define NO_FUNCTION_CSE 1 |
996 | ||
17a819cb YZ |
997 | /* Specify the machine mode that the hardware addresses have. |
998 | After generation of rtl, the compiler makes no further distinction | |
999 | between pointers and any other objects of this machine mode. */ | |
43e9d192 | 1000 | #define Pmode DImode |
17a819cb YZ |
1001 | |
1002 | /* A C expression whose value is zero if pointers that need to be extended | |
1003 | from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and | |
1004 | greater then zero if they are zero-extended and less then zero if the | |
1005 | ptr_extend instruction should be used. */ | |
1006 | #define POINTERS_EXTEND_UNSIGNED 1 | |
1007 | ||
1008 | /* Mode of a function address in a call instruction (for indexing purposes). */ | |
43e9d192 IB |
1009 | #define FUNCTION_MODE Pmode |
1010 | ||
1011 | #define SELECT_CC_MODE(OP, X, Y) aarch64_select_cc_mode (OP, X, Y) | |
1012 | ||
f8bf91ab N |
1013 | #define REVERSIBLE_CC_MODE(MODE) 1 |
1014 | ||
43e9d192 IB |
1015 | #define REVERSE_CONDITION(CODE, MODE) \ |
1016 | (((MODE) == CCFPmode || (MODE) == CCFPEmode) \ | |
1017 | ? reverse_condition_maybe_unordered (CODE) \ | |
1018 | : reverse_condition (CODE)) | |
1019 | ||
1020 | #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \ | |
952e7819 | 1021 | ((VALUE) = GET_MODE_UNIT_BITSIZE (MODE), 2) |
43e9d192 | 1022 | #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \ |
952e7819 | 1023 | ((VALUE) = GET_MODE_UNIT_BITSIZE (MODE), 2) |
43e9d192 IB |
1024 | |
1025 | #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, LR_REGNUM) | |
1026 | ||
1027 | #define RETURN_ADDR_RTX aarch64_return_addr | |
1028 | ||
b5f794b4 | 1029 | /* BTI c + 3 insns + 2 pointer-sized entries. */ |
28514dda | 1030 | #define TRAMPOLINE_SIZE (TARGET_ILP32 ? 24 : 32) |
43e9d192 IB |
1031 | |
1032 | /* Trampolines contain dwords, so must be dword aligned. */ | |
1033 | #define TRAMPOLINE_ALIGNMENT 64 | |
1034 | ||
1035 | /* Put trampolines in the text section so that mapping symbols work | |
1036 | correctly. */ | |
1037 | #define TRAMPOLINE_SECTION text_section | |
43e9d192 IB |
1038 | |
1039 | /* To start with. */ | |
b9066f5a MW |
1040 | #define BRANCH_COST(SPEED_P, PREDICTABLE_P) \ |
1041 | (aarch64_branch_cost (SPEED_P, PREDICTABLE_P)) | |
43e9d192 IB |
1042 | \f |
1043 | ||
1044 | /* Assembly output. */ | |
1045 | ||
1046 | /* For now we'll make all jump tables pc-relative. */ | |
1047 | #define CASE_VECTOR_PC_RELATIVE 1 | |
1048 | ||
1049 | #define CASE_VECTOR_SHORTEN_MODE(min, max, body) \ | |
1050 | ((min < -0x1fff0 || max > 0x1fff0) ? SImode \ | |
1051 | : (min < -0x1f0 || max > 0x1f0) ? HImode \ | |
1052 | : QImode) | |
1053 | ||
1054 | /* Jump table alignment is explicit in ASM_OUTPUT_CASE_LABEL. */ | |
1055 | #define ADDR_VEC_ALIGN(JUMPTABLE) 0 | |
1056 | ||
92d649c4 VK |
1057 | #define MCOUNT_NAME "_mcount" |
1058 | ||
1059 | #define NO_PROFILE_COUNTERS 1 | |
1060 | ||
1061 | /* Emit rtl for profiling. Output assembler code to FILE | |
1062 | to call "_mcount" for profiling a function entry. */ | |
3294102b MS |
1063 | #define PROFILE_HOOK(LABEL) \ |
1064 | { \ | |
1065 | rtx fun, lr; \ | |
1066 | lr = get_hard_reg_initial_val (Pmode, LR_REGNUM); \ | |
1067 | fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \ | |
db69559b | 1068 | emit_library_call (fun, LCT_NORMAL, VOIDmode, lr, Pmode); \ |
3294102b | 1069 | } |
92d649c4 VK |
1070 | |
1071 | /* All the work done in PROFILE_HOOK, but still required. */ | |
1072 | #define FUNCTION_PROFILER(STREAM, LABELNO) do { } while (0) | |
43e9d192 IB |
1073 | |
1074 | /* For some reason, the Linux headers think they know how to define | |
1075 | these macros. They don't!!! */ | |
1076 | #undef ASM_APP_ON | |
1077 | #undef ASM_APP_OFF | |
1078 | #define ASM_APP_ON "\t" ASM_COMMENT_START " Start of user assembly\n" | |
1079 | #define ASM_APP_OFF "\t" ASM_COMMENT_START " End of user assembly\n" | |
1080 | ||
43e9d192 IB |
1081 | #define CONSTANT_POOL_BEFORE_FUNCTION 0 |
1082 | ||
1083 | /* This definition should be relocated to aarch64-elf-raw.h. This macro | |
1084 | should be undefined in aarch64-linux.h and a clear_cache pattern | |
1085 | implmented to emit either the call to __aarch64_sync_cache_range() | |
1086 | directly or preferably the appropriate sycall or cache clear | |
1087 | instructions inline. */ | |
1088 | #define CLEAR_INSN_CACHE(beg, end) \ | |
1089 | extern void __aarch64_sync_cache_range (void *, void *); \ | |
1090 | __aarch64_sync_cache_range (beg, end) | |
1091 | ||
e6bd9fb9 | 1092 | #define SHIFT_COUNT_TRUNCATED (!TARGET_SIMD) |
43e9d192 | 1093 | |
73d9ac6a IB |
1094 | /* Choose appropriate mode for caller saves, so we do the minimum |
1095 | required size of load/store. */ | |
1096 | #define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ | |
1097 | aarch64_hard_regno_caller_save_mode ((REGNO), (NREGS), (MODE)) | |
1098 | ||
d78006d9 KT |
1099 | #undef SWITCHABLE_TARGET |
1100 | #define SWITCHABLE_TARGET 1 | |
1101 | ||
43e9d192 IB |
1102 | /* Check TLS Descriptors mechanism is selected. */ |
1103 | #define TARGET_TLS_DESC (aarch64_tls_dialect == TLS_DESCRIPTORS) | |
1104 | ||
1105 | extern enum aarch64_code_model aarch64_cmodel; | |
1106 | ||
1107 | /* When using the tiny addressing model conditional and unconditional branches | |
1108 | can span the whole of the available address space (1MB). */ | |
1109 | #define HAS_LONG_COND_BRANCH \ | |
1110 | (aarch64_cmodel == AARCH64_CMODEL_TINY \ | |
1111 | || aarch64_cmodel == AARCH64_CMODEL_TINY_PIC) | |
1112 | ||
1113 | #define HAS_LONG_UNCOND_BRANCH \ | |
1114 | (aarch64_cmodel == AARCH64_CMODEL_TINY \ | |
1115 | || aarch64_cmodel == AARCH64_CMODEL_TINY_PIC) | |
1116 | ||
2ca5b430 KT |
1117 | #define TARGET_SUPPORTS_WIDE_INT 1 |
1118 | ||
635e66fe AL |
1119 | /* Modes valid for AdvSIMD D registers, i.e. that fit in half a Q register. */ |
1120 | #define AARCH64_VALID_SIMD_DREG_MODE(MODE) \ | |
1121 | ((MODE) == V2SImode || (MODE) == V4HImode || (MODE) == V8QImode \ | |
1122 | || (MODE) == V2SFmode || (MODE) == V4HFmode || (MODE) == DImode \ | |
1123 | || (MODE) == DFmode) | |
1124 | ||
43e9d192 IB |
1125 | /* Modes valid for AdvSIMD Q registers. */ |
1126 | #define AARCH64_VALID_SIMD_QREG_MODE(MODE) \ | |
1127 | ((MODE) == V4SImode || (MODE) == V8HImode || (MODE) == V16QImode \ | |
71a11456 AL |
1128 | || (MODE) == V4SFmode || (MODE) == V8HFmode || (MODE) == V2DImode \ |
1129 | || (MODE) == V2DFmode) | |
43e9d192 | 1130 | |
7ac29c0f RS |
1131 | #define ENDIAN_LANE_N(NUNITS, N) \ |
1132 | (BYTES_BIG_ENDIAN ? NUNITS - 1 - N : N) | |
e58bf20a | 1133 | |
9815fafa RE |
1134 | /* Support for a configure-time default CPU, etc. We currently support |
1135 | --with-arch and --with-cpu. Both are ignored if either is specified | |
1136 | explicitly on the command line at run time. */ | |
1137 | #define OPTION_DEFAULT_SPECS \ | |
1138 | {"arch", "%{!march=*:%{!mcpu=*:-march=%(VALUE)}}" }, \ | |
1139 | {"cpu", "%{!march=*:%{!mcpu=*:-mcpu=%(VALUE)}}" }, | |
1140 | ||
054b4005 JG |
1141 | #define MCPU_TO_MARCH_SPEC \ |
1142 | " %{mcpu=*:-march=%:rewrite_mcpu(%{mcpu=*:%*})}" | |
682287fb JG |
1143 | |
1144 | extern const char *aarch64_rewrite_mcpu (int argc, const char **argv); | |
054b4005 | 1145 | #define MCPU_TO_MARCH_SPEC_FUNCTIONS \ |
682287fb JG |
1146 | { "rewrite_mcpu", aarch64_rewrite_mcpu }, |
1147 | ||
7e1bcce3 KT |
1148 | #if defined(__aarch64__) |
1149 | extern const char *host_detect_local_cpu (int argc, const char **argv); | |
a08b5429 | 1150 | #define HAVE_LOCAL_CPU_DETECT |
7e1bcce3 KT |
1151 | # define EXTRA_SPEC_FUNCTIONS \ |
1152 | { "local_cpu_detect", host_detect_local_cpu }, \ | |
054b4005 | 1153 | MCPU_TO_MARCH_SPEC_FUNCTIONS |
7e1bcce3 KT |
1154 | |
1155 | # define MCPU_MTUNE_NATIVE_SPECS \ | |
1156 | " %{march=native:%<march=native %:local_cpu_detect(arch)}" \ | |
1157 | " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}" \ | |
1158 | " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}" | |
1159 | #else | |
1160 | # define MCPU_MTUNE_NATIVE_SPECS "" | |
054b4005 | 1161 | # define EXTRA_SPEC_FUNCTIONS MCPU_TO_MARCH_SPEC_FUNCTIONS |
7e1bcce3 KT |
1162 | #endif |
1163 | ||
682287fb | 1164 | #define ASM_CPU_SPEC \ |
054b4005 | 1165 | MCPU_TO_MARCH_SPEC |
682287fb | 1166 | |
682287fb JG |
1167 | #define EXTRA_SPECS \ |
1168 | { "asm_cpu_spec", ASM_CPU_SPEC } | |
1169 | ||
5fca7b66 RH |
1170 | #define ASM_OUTPUT_POOL_EPILOGUE aarch64_asm_output_pool_epilogue |
1171 | ||
1b62ed4f JG |
1172 | /* This type is the user-visible __fp16, and a pointer to that type. We |
1173 | need it in many places in the backend. Defined in aarch64-builtins.c. */ | |
1174 | extern tree aarch64_fp16_type_node; | |
1175 | extern tree aarch64_fp16_ptr_type_node; | |
1176 | ||
817221cc WD |
1177 | /* The generic unwind code in libgcc does not initialize the frame pointer. |
1178 | So in order to unwind a function using a frame pointer, the very first | |
1179 | function that is unwound must save the frame pointer. That way the frame | |
1180 | pointer is restored and its value is now valid - otherwise _Unwind_GetGR | |
1181 | crashes. Libgcc can now be safely built with -fomit-frame-pointer. */ | |
1182 | #define LIBGCC2_UNWIND_ATTRIBUTE \ | |
1183 | __attribute__((optimize ("no-omit-frame-pointer"))) | |
1184 | ||
43cacb12 RS |
1185 | #ifndef USED_FOR_TARGET |
1186 | extern poly_uint16 aarch64_sve_vg; | |
1187 | ||
1188 | /* The number of bits and bytes in an SVE vector. */ | |
1189 | #define BITS_PER_SVE_VECTOR (poly_uint16 (aarch64_sve_vg * 64)) | |
1190 | #define BYTES_PER_SVE_VECTOR (poly_uint16 (aarch64_sve_vg * 8)) | |
1191 | ||
c600df9a RS |
1192 | /* The number of bits and bytes in an SVE predicate. */ |
1193 | #define BITS_PER_SVE_PRED BYTES_PER_SVE_VECTOR | |
43cacb12 RS |
1194 | #define BYTES_PER_SVE_PRED aarch64_sve_vg |
1195 | ||
1196 | /* The SVE mode for a vector of bytes. */ | |
1197 | #define SVE_BYTE_MODE VNx16QImode | |
1198 | ||
1199 | /* The maximum number of bytes in a fixed-size vector. This is 256 bytes | |
1200 | (for -msve-vector-bits=2048) multiplied by the maximum number of | |
1201 | vectors in a structure mode (4). | |
1202 | ||
1203 | This limit must not be used for variable-size vectors, since | |
1204 | VL-agnostic code must work with arbitary vector lengths. */ | |
1205 | #define MAX_COMPILE_TIME_VEC_BYTES (256 * 4) | |
1206 | #endif | |
1207 | ||
1208 | #define REGMODE_NATURAL_SIZE(MODE) aarch64_regmode_natural_size (MODE) | |
1209 | ||
8c6e3b23 TC |
1210 | /* Allocate a minimum of STACK_CLASH_MIN_BYTES_OUTGOING_ARGS bytes for the |
1211 | outgoing arguments if stack clash protection is enabled. This is essential | |
1212 | as the extra arg space allows us to skip a check in alloca. */ | |
1213 | #undef STACK_DYNAMIC_OFFSET | |
1214 | #define STACK_DYNAMIC_OFFSET(FUNDECL) \ | |
1215 | ((flag_stack_clash_protection \ | |
1216 | && cfun->calls_alloca \ | |
1217 | && known_lt (crtl->outgoing_args_size, \ | |
1218 | STACK_CLASH_MIN_BYTES_OUTGOING_ARGS)) \ | |
1219 | ? ROUND_UP (STACK_CLASH_MIN_BYTES_OUTGOING_ARGS, \ | |
1220 | STACK_BOUNDARY / BITS_PER_UNIT) \ | |
1221 | : (crtl->outgoing_args_size + STACK_POINTER_OFFSET)) | |
1222 | ||
43e9d192 | 1223 | #endif /* GCC_AARCH64_H */ |