]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/aarch64/aarch64.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / aarch64 / aarch64.h
CommitLineData
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. */
146extern 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
623enum 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
704enum 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. */
731extern 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
753struct 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
817typedef 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. */
826enum 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
838enum 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. */
863typedef 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
1105extern 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
1144extern 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__)
1149extern 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. */
1174extern tree aarch64_fp16_type_node;
1175extern 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
1186extern 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 */