xref: /netbsd-src/external/gpl3/gcc/dist/gcc/config/aarch64/arm_acle.h (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /* AArch64 Non-NEON ACLE intrinsics include file.
2 
3    Copyright (C) 2014-2022 Free Software Foundation, Inc.
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>
31 #include <stddef.h>
32 
33 #pragma GCC aarch64 "arm_acle.h"
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
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)					  \
43 {									  \
44   size_t __size = sizeof (TYPE) * __CHAR_BIT__;				  \
45   __rotate = __rotate % __size;						  \
46   return __value >> __rotate | __value << ((__size - __rotate) % __size); \
47 }
48 
_GCC_ARM_ACLE_ROR_FN(__ror,uint32_t)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 
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__))
__jcvt(double __a)95 __jcvt (double __a)
96 {
97   return __builtin_aarch64_jcvtzs (__a);
98 }
99 
100 #pragma GCC pop_options
101 
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__))
__rint32zf(float __a)106 __rint32zf (float __a)
107 {
108   return __builtin_aarch64_frint32zsf (__a);
109 }
110 
111 __extension__ extern __inline double
112 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rint32z(double __a)113 __rint32z (double __a)
114 {
115   return __builtin_aarch64_frint32zdf (__a);
116 }
117 
118 __extension__ extern __inline float
119 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rint64zf(float __a)120 __rint64zf (float __a)
121 {
122   return __builtin_aarch64_frint64zsf (__a);
123 }
124 
125 __extension__ extern __inline double
126 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rint64z(double __a)127 __rint64z (double __a)
128 {
129   return __builtin_aarch64_frint64zdf (__a);
130 }
131 
132 __extension__ extern __inline float
133 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rint32xf(float __a)134 __rint32xf (float __a)
135 {
136   return __builtin_aarch64_frint32xsf (__a);
137 }
138 
139 __extension__ extern __inline double
140 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rint32x(double __a)141 __rint32x (double __a)
142 {
143   return __builtin_aarch64_frint32xdf (__a);
144 }
145 
146 __extension__ extern __inline float
147 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rint64xf(float __a)148 __rint64xf (float __a)
149 {
150   return __builtin_aarch64_frint64xsf (__a);
151 }
152 
153 __extension__ extern __inline double
154 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rint64x(double __a)155 __rint64x (double __a)
156 {
157   return __builtin_aarch64_frint64xdf (__a);
158 }
159 
160 
161 #pragma GCC pop_options
162 
163 #pragma GCC push_options
164 
165 #pragma GCC target ("+nothing+crc")
166 
167 __extension__ extern __inline uint32_t
168 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32b(uint32_t __a,uint8_t __b)169 __crc32b (uint32_t __a, uint8_t __b)
170 {
171   return __builtin_aarch64_crc32b (__a, __b);
172 }
173 
174 __extension__ extern __inline uint32_t
175 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32cb(uint32_t __a,uint8_t __b)176 __crc32cb (uint32_t __a, uint8_t __b)
177 {
178   return __builtin_aarch64_crc32cb (__a, __b);
179 }
180 
181 __extension__ extern __inline uint32_t
182 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32ch(uint32_t __a,uint16_t __b)183 __crc32ch (uint32_t __a, uint16_t __b)
184 {
185   return __builtin_aarch64_crc32ch (__a, __b);
186 }
187 
188 __extension__ extern __inline uint32_t
189 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32cw(uint32_t __a,uint32_t __b)190 __crc32cw (uint32_t __a, uint32_t __b)
191 {
192   return __builtin_aarch64_crc32cw (__a, __b);
193 }
194 
195 __extension__ extern __inline uint32_t
196 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32cd(uint32_t __a,uint64_t __b)197 __crc32cd (uint32_t __a, uint64_t __b)
198 {
199   return __builtin_aarch64_crc32cx (__a, __b);
200 }
201 
202 __extension__ extern __inline uint32_t
203 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32h(uint32_t __a,uint16_t __b)204 __crc32h (uint32_t __a, uint16_t __b)
205 {
206   return __builtin_aarch64_crc32h (__a, __b);
207 }
208 
209 __extension__ extern __inline uint32_t
210 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32w(uint32_t __a,uint32_t __b)211 __crc32w (uint32_t __a, uint32_t __b)
212 {
213   return __builtin_aarch64_crc32w (__a, __b);
214 }
215 
216 __extension__ extern __inline uint32_t
217 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__crc32d(uint32_t __a,uint64_t __b)218 __crc32d (uint32_t __a, uint64_t __b)
219 {
220   return __builtin_aarch64_crc32x (__a, __b);
221 }
222 
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 
241 __extension__ extern __inline uint64_t
242 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__tstart(void)243 __tstart (void)
244 {
245   return __builtin_aarch64_tstart ();
246 }
247 
248 __extension__ extern __inline void
249 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__tcommit(void)250 __tcommit (void)
251 {
252   __builtin_aarch64_tcommit ();
253 }
254 
255 __extension__ extern __inline void
256 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__tcancel(const uint64_t __reason)257 __tcancel (const uint64_t __reason)
258 {
259   __builtin_aarch64_tcancel (__reason);
260 }
261 
262 __extension__ extern __inline uint64_t
263 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__ttest(void)264 __ttest (void)
265 {
266   return __builtin_aarch64_ttest ();
267 }
268 
269 #pragma GCC pop_options
270 #endif
271 
272 #ifdef __ARM_FEATURE_LS64
273 typedef __arm_data512_t data512_t;
274 #endif
275 
276 #pragma GCC push_options
277 #pragma GCC target ("+nothing+rng")
278 __extension__ extern __inline int
279 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rndr(uint64_t * __res)280 __rndr (uint64_t *__res)
281 {
282   return __builtin_aarch64_rndr (__res);
283 }
284 
285 __extension__ extern __inline int
286 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
__rndrrs(uint64_t * __res)287 __rndrrs (uint64_t *__res)
288 {
289   return __builtin_aarch64_rndrrs (__res);
290 }
291 
292 #pragma GCC pop_options
293 
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 
317 #ifdef __cplusplus
318 }
319 #endif
320 
321 #endif
322