]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/aarch64/arm_acle.h
aarch64: Allow compiler to define ls64 builtins [PR110132]
[thirdparty/gcc.git] / gcc / config / aarch64 / arm_acle.h
CommitLineData
5d357f26
KT
1/* AArch64 Non-NEON ACLE intrinsics include file.
2
7adcbafe 3 Copyright (C) 2014-2022 Free Software Foundation, Inc.
5d357f26
KT
4 Contributed by ARM Ltd.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 3, or (at your
11 option) any later version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
17
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
21
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
26
27#ifndef _GCC_ARM_ACLE_H
28#define _GCC_ARM_ACLE_H
29
30#include <stdint.h>
28a7b5df 31#include <stddef.h>
e4ea20c8 32
af3cadb5
TC
33#pragma GCC aarch64 "arm_acle.h"
34
5d357f26
KT
35#ifdef __cplusplus
36extern "C" {
37#endif
38
28a7b5df
ASDV
39#define _GCC_ARM_ACLE_ROR_FN(NAME, TYPE) \
40__extension__ extern __inline TYPE \
41__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \
42NAME (TYPE __value, uint32_t __rotate) \
43{ \
44 size_t __size = sizeof (TYPE) * __CHAR_BIT__; \
45 __rotate = __rotate % __size; \
46 return __value >> __rotate | __value << ((__size - __rotate) % __size); \
47}
48
49_GCC_ARM_ACLE_ROR_FN (__ror, uint32_t)
50_GCC_ARM_ACLE_ROR_FN (__rorl, unsigned long)
51_GCC_ARM_ACLE_ROR_FN (__rorll, uint64_t)
52
53#undef _GCC_ARM_ACLE_ROR_FN
54
55#define _GCC_ARM_ACLE_DATA_FN(NAME, BUILTIN, ITYPE, RTYPE) \
56__extension__ extern __inline RTYPE \
57__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \
58__##NAME (ITYPE __value) \
59{ \
60 return __builtin_##BUILTIN (__value); \
61}
62
63_GCC_ARM_ACLE_DATA_FN (clz, clz, uint32_t, unsigned int)
64_GCC_ARM_ACLE_DATA_FN (clzl, clzl, unsigned long, unsigned int)
65_GCC_ARM_ACLE_DATA_FN (clzll, clzll, uint64_t, unsigned int)
66_GCC_ARM_ACLE_DATA_FN (cls, clrsb, uint32_t, unsigned int)
67_GCC_ARM_ACLE_DATA_FN (clsl, clrsbl, unsigned long, unsigned int)
68_GCC_ARM_ACLE_DATA_FN (clsll, clrsbll, uint64_t, unsigned int)
69_GCC_ARM_ACLE_DATA_FN (rev16, aarch64_rev16, uint32_t, uint32_t)
70_GCC_ARM_ACLE_DATA_FN (rev16l, aarch64_rev16l, unsigned long, unsigned long)
71_GCC_ARM_ACLE_DATA_FN (rev16ll, aarch64_rev16ll, uint64_t, uint64_t)
72_GCC_ARM_ACLE_DATA_FN (rbit, aarch64_rbit, uint32_t, uint32_t)
73_GCC_ARM_ACLE_DATA_FN (rbitl, aarch64_rbitl, unsigned long, unsigned long)
74_GCC_ARM_ACLE_DATA_FN (rbitll, aarch64_rbitll, uint64_t, uint64_t)
75_GCC_ARM_ACLE_DATA_FN (revsh, bswap16, int16_t, int16_t)
76_GCC_ARM_ACLE_DATA_FN (rev, bswap32, uint32_t, uint32_t)
77_GCC_ARM_ACLE_DATA_FN (revll, bswap64, uint64_t, uint64_t)
78
79#undef _GCC_ARM_ACLE_DATA_FN
80
81__extension__ extern __inline unsigned long
82__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
83__revl (unsigned long __value)
84{
85 if (sizeof (unsigned long) == 8)
86 return __revll (__value);
87 else
88 return __rev (__value);
89}
90
e1d5d19e
KT
91#pragma GCC push_options
92#pragma GCC target ("arch=armv8.3-a")
6a82f012
JW
93__extension__ extern __inline int32_t
94__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
e1d5d19e
KT
95__jcvt (double __a)
96{
97 return __builtin_aarch64_jcvtzs (__a);
98}
99
100#pragma GCC pop_options
101
10bd1d96
KT
102#pragma GCC push_options
103#pragma GCC target ("arch=armv8.5-a")
6a82f012
JW
104__extension__ extern __inline float
105__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
106__rint32zf (float __a)
107{
108 return __builtin_aarch64_frint32zsf (__a);
109}
110
6a82f012
JW
111__extension__ extern __inline double
112__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
113__rint32z (double __a)
114{
115 return __builtin_aarch64_frint32zdf (__a);
116}
117
6a82f012
JW
118__extension__ extern __inline float
119__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
120__rint64zf (float __a)
121{
122 return __builtin_aarch64_frint64zsf (__a);
123}
124
6a82f012
JW
125__extension__ extern __inline double
126__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
127__rint64z (double __a)
128{
129 return __builtin_aarch64_frint64zdf (__a);
130}
131
6a82f012
JW
132__extension__ extern __inline float
133__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
134__rint32xf (float __a)
135{
136 return __builtin_aarch64_frint32xsf (__a);
137}
138
6a82f012
JW
139__extension__ extern __inline double
140__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
141__rint32x (double __a)
142{
143 return __builtin_aarch64_frint32xdf (__a);
144}
145
6a82f012
JW
146__extension__ extern __inline float
147__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
148__rint64xf (float __a)
149{
150 return __builtin_aarch64_frint64xsf (__a);
151}
152
6a82f012
JW
153__extension__ extern __inline double
154__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
10bd1d96
KT
155__rint64x (double __a)
156{
157 return __builtin_aarch64_frint64xdf (__a);
158}
159
160
161#pragma GCC pop_options
162
89626179
SD
163#pragma GCC push_options
164
165#pragma GCC target ("+nothing+crc")
166
6a82f012
JW
167__extension__ extern __inline uint32_t
168__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
169__crc32b (uint32_t __a, uint8_t __b)
170{
171 return __builtin_aarch64_crc32b (__a, __b);
172}
173
6a82f012
JW
174__extension__ extern __inline uint32_t
175__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
176__crc32cb (uint32_t __a, uint8_t __b)
177{
178 return __builtin_aarch64_crc32cb (__a, __b);
179}
180
6a82f012
JW
181__extension__ extern __inline uint32_t
182__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
183__crc32ch (uint32_t __a, uint16_t __b)
184{
185 return __builtin_aarch64_crc32ch (__a, __b);
186}
187
6a82f012
JW
188__extension__ extern __inline uint32_t
189__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
190__crc32cw (uint32_t __a, uint32_t __b)
191{
192 return __builtin_aarch64_crc32cw (__a, __b);
193}
194
6a82f012
JW
195__extension__ extern __inline uint32_t
196__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
197__crc32cd (uint32_t __a, uint64_t __b)
198{
199 return __builtin_aarch64_crc32cx (__a, __b);
200}
201
6a82f012
JW
202__extension__ extern __inline uint32_t
203__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
204__crc32h (uint32_t __a, uint16_t __b)
205{
206 return __builtin_aarch64_crc32h (__a, __b);
207}
208
6a82f012
JW
209__extension__ extern __inline uint32_t
210__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
211__crc32w (uint32_t __a, uint32_t __b)
212{
213 return __builtin_aarch64_crc32w (__a, __b);
214}
215
6a82f012
JW
216__extension__ extern __inline uint32_t
217__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
5d357f26
KT
218__crc32d (uint32_t __a, uint64_t __b)
219{
220 return __builtin_aarch64_crc32x (__a, __b);
221}
222
89626179
SD
223#pragma GCC pop_options
224
225#ifdef __ARM_FEATURE_TME
226#pragma GCC push_options
227#pragma GCC target ("+nothing+tme")
228
229#define _TMFAILURE_REASON 0x00007fffu
230#define _TMFAILURE_RTRY 0x00008000u
231#define _TMFAILURE_CNCL 0x00010000u
232#define _TMFAILURE_MEM 0x00020000u
233#define _TMFAILURE_IMP 0x00040000u
234#define _TMFAILURE_ERR 0x00080000u
235#define _TMFAILURE_SIZE 0x00100000u
236#define _TMFAILURE_NEST 0x00200000u
237#define _TMFAILURE_DBG 0x00400000u
238#define _TMFAILURE_INT 0x00800000u
239#define _TMFAILURE_TRIVIAL 0x01000000u
240
6a82f012
JW
241__extension__ extern __inline uint64_t
242__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
89626179
SD
243__tstart (void)
244{
245 return __builtin_aarch64_tstart ();
246}
247
6a82f012
JW
248__extension__ extern __inline void
249__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
89626179
SD
250__tcommit (void)
251{
252 __builtin_aarch64_tcommit ();
253}
254
6a82f012
JW
255__extension__ extern __inline void
256__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
89626179
SD
257__tcancel (const uint64_t __reason)
258{
259 __builtin_aarch64_tcancel (__reason);
260}
261
6a82f012
JW
262__extension__ extern __inline uint64_t
263__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
89626179
SD
264__ttest (void)
265{
266 return __builtin_aarch64_ttest ();
5d357f26 267}
5d357f26 268
e4ea20c8 269#pragma GCC pop_options
89626179
SD
270#endif
271
fdcddba8 272#ifdef __ARM_FEATURE_LS64
fdcddba8 273typedef __arm_data512_t data512_t;
fdcddba8
PW
274#endif
275
c5dc215d
KT
276#pragma GCC push_options
277#pragma GCC target ("+nothing+rng")
6a82f012
JW
278__extension__ extern __inline int
279__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
c5dc215d
KT
280__rndr (uint64_t *__res)
281{
282 return __builtin_aarch64_rndr (__res);
283}
284
6a82f012
JW
285__extension__ extern __inline int
286__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
c5dc215d
KT
287__rndrrs (uint64_t *__res)
288{
289 return __builtin_aarch64_rndrrs (__res);
290}
291
292#pragma GCC pop_options
293
ef01e6bb
DZ
294#pragma GCC push_options
295#pragma GCC target ("arch=armv8.5-a+memtag")
296
297#define __arm_mte_create_random_tag(__ptr, __u64_mask) \
298 __builtin_aarch64_memtag_irg(__ptr, __u64_mask)
299
300#define __arm_mte_exclude_tag(__ptr, __u64_excluded) \
301 __builtin_aarch64_memtag_gmi(__ptr, __u64_excluded)
302
303#define __arm_mte_ptrdiff(__ptr_a, __ptr_b) \
304 __builtin_aarch64_memtag_subp(__ptr_a, __ptr_b)
305
306#define __arm_mte_increment_tag(__ptr, __u_offset) \
307 __builtin_aarch64_memtag_inc_tag(__ptr, __u_offset)
308
309#define __arm_mte_set_tag(__tagged_address) \
310 __builtin_aarch64_memtag_set_tag(__tagged_address)
311
312#define __arm_mte_get_tag(__address) \
313 __builtin_aarch64_memtag_get_tag(__address)
314
315#pragma GCC pop_options
316
89626179
SD
317#ifdef __cplusplus
318}
319#endif
e4ea20c8 320
5d357f26 321#endif