1 /* AArch64 Non-NEON ACLE intrinsics include file.
3 Copyright (C) 2014-2023 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
6 This file is part of GCC.
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.
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.
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.
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/>. */
27 #ifndef _GCC_ARM_ACLE_H
28 #define _GCC_ARM_ACLE_H
33 #pragma GCC aarch64 "arm_acle.h"
39 #define _GCC_ARM_ACLE_ROR_FN(NAME, TYPE) \
40 __extension__ extern __inline TYPE \
41 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \
42 NAME (TYPE __value, uint32_t __rotate) \
44 size_t __size = sizeof (TYPE) * __CHAR_BIT__; \
45 __rotate = __rotate % __size; \
46 return __value >> __rotate | __value << ((__size - __rotate) % __size); \
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)
53 #undef _GCC_ARM_ACLE_ROR_FN
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) \
60 return __builtin_##BUILTIN (__value); \
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)
79 #undef _GCC_ARM_ACLE_DATA_FN
81 __extension__
extern __inline
unsigned long
82 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
83 __revl (unsigned long __value
)
85 if (sizeof (unsigned long) == 8)
86 return __revll (__value
);
88 return __rev (__value
);
91 #pragma GCC push_options
92 #pragma GCC target ("arch=armv8.3-a")
93 __extension__
extern __inline
int32_t
94 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
97 return __builtin_aarch64_jcvtzs (__a
);
100 #pragma GCC pop_options
102 #pragma GCC push_options
103 #pragma GCC target ("arch=armv8.5-a")
104 __extension__
extern __inline
float
105 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
106 __rint32zf (float __a
)
108 return __builtin_aarch64_frint32zsf (__a
);
111 __extension__
extern __inline
double
112 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
113 __rint32z (double __a
)
115 return __builtin_aarch64_frint32zdf (__a
);
118 __extension__
extern __inline
float
119 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
120 __rint64zf (float __a
)
122 return __builtin_aarch64_frint64zsf (__a
);
125 __extension__
extern __inline
double
126 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
127 __rint64z (double __a
)
129 return __builtin_aarch64_frint64zdf (__a
);
132 __extension__
extern __inline
float
133 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
134 __rint32xf (float __a
)
136 return __builtin_aarch64_frint32xsf (__a
);
139 __extension__
extern __inline
double
140 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
141 __rint32x (double __a
)
143 return __builtin_aarch64_frint32xdf (__a
);
146 __extension__
extern __inline
float
147 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
148 __rint64xf (float __a
)
150 return __builtin_aarch64_frint64xsf (__a
);
153 __extension__
extern __inline
double
154 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
155 __rint64x (double __a
)
157 return __builtin_aarch64_frint64xdf (__a
);
161 #pragma GCC pop_options
163 #pragma GCC push_options
165 #pragma GCC target ("+nothing+crc")
167 __extension__
extern __inline
uint32_t
168 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
169 __crc32b (uint32_t __a
, uint8_t __b
)
171 return __builtin_aarch64_crc32b (__a
, __b
);
174 __extension__
extern __inline
uint32_t
175 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
176 __crc32cb (uint32_t __a
, uint8_t __b
)
178 return __builtin_aarch64_crc32cb (__a
, __b
);
181 __extension__
extern __inline
uint32_t
182 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
183 __crc32ch (uint32_t __a
, uint16_t __b
)
185 return __builtin_aarch64_crc32ch (__a
, __b
);
188 __extension__
extern __inline
uint32_t
189 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
190 __crc32cw (uint32_t __a
, uint32_t __b
)
192 return __builtin_aarch64_crc32cw (__a
, __b
);
195 __extension__
extern __inline
uint32_t
196 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
197 __crc32cd (uint32_t __a
, uint64_t __b
)
199 return __builtin_aarch64_crc32cx (__a
, __b
);
202 __extension__
extern __inline
uint32_t
203 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
204 __crc32h (uint32_t __a
, uint16_t __b
)
206 return __builtin_aarch64_crc32h (__a
, __b
);
209 __extension__
extern __inline
uint32_t
210 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
211 __crc32w (uint32_t __a
, uint32_t __b
)
213 return __builtin_aarch64_crc32w (__a
, __b
);
216 __extension__
extern __inline
uint32_t
217 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
218 __crc32d (uint32_t __a
, uint64_t __b
)
220 return __builtin_aarch64_crc32x (__a
, __b
);
223 #pragma GCC pop_options
225 #ifdef __ARM_FEATURE_TME
226 #pragma GCC push_options
227 #pragma GCC target ("+nothing+tme")
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
241 __extension__
extern __inline
uint64_t
242 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
245 return __builtin_aarch64_tstart ();
248 __extension__
extern __inline
void
249 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
252 __builtin_aarch64_tcommit ();
255 __extension__
extern __inline
void
256 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
257 __tcancel (const uint64_t __reason
)
259 __builtin_aarch64_tcancel (__reason
);
262 __extension__
extern __inline
uint64_t
263 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
266 return __builtin_aarch64_ttest ();
269 #pragma GCC pop_options
272 #ifdef __ARM_FEATURE_LS64
273 #pragma GCC push_options
274 #pragma GCC target ("+nothing+ls64")
276 typedef __arm_data512_t data512_t
;
278 __extension__
extern __inline data512_t
279 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
280 __arm_ld64b (const void *__addr
)
282 return __builtin_aarch64_ld64b (__addr
);
285 __extension__
extern __inline
void
286 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
287 __arm_st64b (void *__addr
, data512_t __value
)
289 __builtin_aarch64_st64b (__addr
, __value
);
292 __extension__
extern __inline
uint64_t
293 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
294 __arm_st64bv (void *__addr
, data512_t __value
)
296 return __builtin_aarch64_st64bv (__addr
, __value
);
299 __extension__
extern __inline
uint64_t
300 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
301 __arm_st64bv0 (void *__addr
, data512_t __value
)
303 return __builtin_aarch64_st64bv0 (__addr
, __value
);
306 #pragma GCC pop_options
309 #pragma GCC push_options
310 #pragma GCC target ("+nothing+rng")
311 __extension__
extern __inline
int
312 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
313 __rndr (uint64_t *__res
)
315 return __builtin_aarch64_rndr (__res
);
318 __extension__
extern __inline
int
319 __attribute__ ((__always_inline__
, __gnu_inline__
, __artificial__
))
320 __rndrrs (uint64_t *__res
)
322 return __builtin_aarch64_rndrrs (__res
);
325 #pragma GCC pop_options
327 #pragma GCC push_options
328 #pragma GCC target ("arch=armv8.5-a+memtag")
330 #define __arm_mte_create_random_tag(__ptr, __u64_mask) \
331 __builtin_aarch64_memtag_irg(__ptr, __u64_mask)
333 #define __arm_mte_exclude_tag(__ptr, __u64_excluded) \
334 __builtin_aarch64_memtag_gmi(__ptr, __u64_excluded)
336 #define __arm_mte_ptrdiff(__ptr_a, __ptr_b) \
337 __builtin_aarch64_memtag_subp(__ptr_a, __ptr_b)
339 #define __arm_mte_increment_tag(__ptr, __u_offset) \
340 __builtin_aarch64_memtag_inc_tag(__ptr, __u_offset)
342 #define __arm_mte_set_tag(__tagged_address) \
343 __builtin_aarch64_memtag_set_tag(__tagged_address)
345 #define __arm_mte_get_tag(__address) \
346 __builtin_aarch64_memtag_get_tag(__address)
348 #pragma GCC pop_options