]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/arm_acle.h
Alphabetize my entry in MAINTAINER's DCO list.
[thirdparty/gcc.git] / gcc / config / arm / arm_acle.h
CommitLineData
582e2e43
KT
1/* ARM Non-NEON ACLE intrinsics include file.
2
a945c346 3 Copyright (C) 2013-2024 Free Software Foundation, Inc.
582e2e43
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>
f3dbc411 31
582e2e43
KT
32#ifdef __cplusplus
33extern "C" {
34#endif
35
f3dbc411
CS
36#define _GCC_ARM_ACLE_ROR_FN(NAME, TYPE) \
37__extension__ extern __inline TYPE \
38__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \
39NAME (TYPE __value, uint32_t __rotate) \
40{ \
41 int __size = (int) sizeof (TYPE) * __CHAR_BIT__; \
42 __rotate = __rotate % __size; \
43 return __value >> __rotate | __value << ((__size - __rotate) % __size); \
44}
45
46_GCC_ARM_ACLE_ROR_FN (__ror, uint32_t)
47_GCC_ARM_ACLE_ROR_FN (__rorl, unsigned long)
48_GCC_ARM_ACLE_ROR_FN (__rorll, uint64_t)
49
50#undef _GCC_ARM_ACLE_ROR_FN
51
52#define _GCC_ARM_ACLE_DATA_FN(NAME, ITYPE, RTYPE) \
53__extension__ extern __inline RTYPE \
54__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \
55__##NAME (ITYPE __value)
56
57#define _GCC_ARM_ACLE_DATA_ALIAS(NAME, BUILTIN, ITYPE, RTYPE) \
58_GCC_ARM_ACLE_DATA_FN(NAME, ITYPE, RTYPE) \
59{ \
60 return __builtin_##BUILTIN (__value); \
61}
62
63_GCC_ARM_ACLE_DATA_ALIAS (clz, clz, uint32_t, unsigned int)
64_GCC_ARM_ACLE_DATA_ALIAS (clzl, clzl, unsigned long, unsigned int)
65_GCC_ARM_ACLE_DATA_ALIAS (clzll, clzll, uint64_t, unsigned int)
66_GCC_ARM_ACLE_DATA_ALIAS (cls, clrsb, uint32_t, unsigned int)
67_GCC_ARM_ACLE_DATA_ALIAS (clsl, clrsbl, unsigned long, unsigned int)
68_GCC_ARM_ACLE_DATA_ALIAS (clsll, clrsbll, uint64_t, unsigned int)
69_GCC_ARM_ACLE_DATA_ALIAS (revsh, bswap16, int16_t, int16_t)
70_GCC_ARM_ACLE_DATA_ALIAS (rev, bswap32, uint32_t, uint32_t)
71_GCC_ARM_ACLE_DATA_ALIAS (revl, bswap32, unsigned long, unsigned long)
72_GCC_ARM_ACLE_DATA_ALIAS (revll, bswap64, uint64_t, uint64_t)
73#if __ARM_ARCH >= 6
74_GCC_ARM_ACLE_DATA_ALIAS (rev16, arm_rev16si2, uint32_t, uint32_t)
75_GCC_ARM_ACLE_DATA_ALIAS (rev16l, arm_rev16si2, unsigned long, unsigned long)
76#else
77_GCC_ARM_ACLE_DATA_FN(rev16, uint32_t, uint32_t) {
78 return ((__value & 0xff00ff) << 8 | (__value & 0xff00ff00) >> 8);
79}
80_GCC_ARM_ACLE_DATA_FN(rev16l, unsigned long, unsigned long) {
81 return ((__value & 0xff00ff) << 8 | (__value & 0xff00ff00) >> 8);
82}
83#endif
84_GCC_ARM_ACLE_DATA_FN(rev16ll, uint64_t, uint64_t) {
85 return __rev16l(__value) | (uint64_t)__rev16l(__value >> 32) << 32;
86}
87
88#if __ARM_ARCH_6T2__ || __ARM_ARCH >= 7
89_GCC_ARM_ACLE_DATA_ALIAS (rbit, arm_rbit, uint32_t, uint32_t)
90_GCC_ARM_ACLE_DATA_ALIAS (rbitl, arm_rbit, unsigned long, unsigned int)
91_GCC_ARM_ACLE_DATA_FN(rbitll, uint64_t, uint64_t) {
92 return ((uint64_t)__rbit(__value) << 32) | __rbit(__value >> 32);
93}
94#endif
95
96#undef _GCC_ARM_ACLE_DATA_ALIAS
97#undef _GCC_ARM_ACLE_DATA_FN
98
d57daa0c
AV
99#if (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4
100__extension__ static __inline void __attribute__ ((__always_inline__))
101__arm_cdp (const unsigned int __coproc, const unsigned int __opc1,
102 const unsigned int __CRd, const unsigned int __CRn,
103 const unsigned int __CRm, const unsigned int __opc2)
104{
12b2b910 105 __builtin_arm_cdp (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2);
d57daa0c
AV
106}
107
3811581f
AV
108__extension__ static __inline void __attribute__ ((__always_inline__))
109__arm_ldc (const unsigned int __coproc, const unsigned int __CRd,
110 const void * __p)
111{
12b2b910 112 __builtin_arm_ldc (__coproc, __CRd, __p);
3811581f
AV
113}
114
115__extension__ static __inline void __attribute__ ((__always_inline__))
116__arm_ldcl (const unsigned int __coproc, const unsigned int __CRd,
117 const void * __p)
118{
12b2b910 119 __builtin_arm_ldcl (__coproc, __CRd, __p);
3811581f
AV
120}
121
122__extension__ static __inline void __attribute__ ((__always_inline__))
123__arm_stc (const unsigned int __coproc, const unsigned int __CRd,
124 void * __p)
125{
12b2b910 126 __builtin_arm_stc (__coproc, __CRd, __p);
3811581f
AV
127}
128
129__extension__ static __inline void __attribute__ ((__always_inline__))
130__arm_stcl (const unsigned int __coproc, const unsigned int __CRd,
131 void * __p)
132{
12b2b910 133 __builtin_arm_stcl (__coproc, __CRd, __p);
3811581f 134}
ecc9a25b
AV
135
136__extension__ static __inline void __attribute__ ((__always_inline__))
137__arm_mcr (const unsigned int __coproc, const unsigned int __opc1,
138 uint32_t __value, const unsigned int __CRn, const unsigned int __CRm,
139 const unsigned int __opc2)
140{
12b2b910 141 __builtin_arm_mcr (__coproc, __opc1, __value, __CRn, __CRm, __opc2);
ecc9a25b
AV
142}
143
144__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
145__arm_mrc (const unsigned int __coproc, const unsigned int __opc1,
146 const unsigned int __CRn, const unsigned int __CRm,
147 const unsigned int __opc2)
148{
149 return __builtin_arm_mrc (__coproc, __opc1, __CRn, __CRm, __opc2);
150}
d57daa0c
AV
151#if __ARM_ARCH >= 5
152__extension__ static __inline void __attribute__ ((__always_inline__))
153__arm_cdp2 (const unsigned int __coproc, const unsigned int __opc1,
154 const unsigned int __CRd, const unsigned int __CRn,
155 const unsigned int __CRm, const unsigned int __opc2)
156{
12b2b910 157 __builtin_arm_cdp2 (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2);
d57daa0c 158}
3811581f
AV
159
160__extension__ static __inline void __attribute__ ((__always_inline__))
161__arm_ldc2 (const unsigned int __coproc, const unsigned int __CRd,
162 const void * __p)
163{
12b2b910 164 __builtin_arm_ldc2 (__coproc, __CRd, __p);
3811581f
AV
165}
166
167__extension__ static __inline void __attribute__ ((__always_inline__))
168__arm_ldc2l (const unsigned int __coproc, const unsigned int __CRd,
169 const void * __p)
170{
12b2b910 171 __builtin_arm_ldc2l (__coproc, __CRd, __p);
3811581f
AV
172}
173
174__extension__ static __inline void __attribute__ ((__always_inline__))
175__arm_stc2 (const unsigned int __coproc, const unsigned int __CRd,
176 void * __p)
177{
12b2b910 178 __builtin_arm_stc2 (__coproc, __CRd, __p);
3811581f
AV
179}
180
181__extension__ static __inline void __attribute__ ((__always_inline__))
182__arm_stc2l (const unsigned int __coproc, const unsigned int __CRd,
183 void * __p)
184{
12b2b910 185 __builtin_arm_stc2l (__coproc, __CRd, __p);
3811581f 186}
ecc9a25b
AV
187
188__extension__ static __inline void __attribute__ ((__always_inline__))
189__arm_mcr2 (const unsigned int __coproc, const unsigned int __opc1,
190 uint32_t __value, const unsigned int __CRn,
191 const unsigned int __CRm, const unsigned int __opc2)
192{
12b2b910 193 __builtin_arm_mcr2 (__coproc, __opc1, __value, __CRn, __CRm, __opc2);
ecc9a25b
AV
194}
195
196__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
197__arm_mrc2 (const unsigned int __coproc, const unsigned int __opc1,
198 const unsigned int __CRn, const unsigned int __CRm,
199 const unsigned int __opc2)
200{
201 return __builtin_arm_mrc2 (__coproc, __opc1, __CRn, __CRm, __opc2);
202}
f3caa118
AV
203
204#if __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__)
205
206__extension__ static __inline void __attribute__ ((__always_inline__))
207__arm_mcrr (const unsigned int __coproc, const unsigned int __opc1,
208 uint64_t __value, const unsigned int __CRm)
209{
12b2b910 210 __builtin_arm_mcrr (__coproc, __opc1, __value, __CRm);
f3caa118
AV
211}
212
213__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
214__arm_mrrc (const unsigned int __coproc, const unsigned int __opc1,
215 const unsigned int __CRm)
216{
217 return __builtin_arm_mrrc (__coproc, __opc1, __CRm);
218}
219
220#if __ARM_ARCH >= 6
221
222__extension__ static __inline void __attribute__ ((__always_inline__))
223__arm_mcrr2 (const unsigned int __coproc, const unsigned int __opc1,
224 uint64_t __value, const unsigned int __CRm)
225{
12b2b910 226 __builtin_arm_mcrr2 (__coproc, __opc1, __value, __CRm);
f3caa118
AV
227}
228
229__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
230__arm_mrrc2 (const unsigned int __coproc, const unsigned int __opc1,
231 const unsigned int __CRm)
232{
233 return __builtin_arm_mrrc2 (__coproc, __opc1, __CRm);
234}
235#endif /* __ARM_ARCH >= 6. */
236#endif /* __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__). */
d57daa0c
AV
237#endif /* __ARM_ARCH >= 5. */
238#endif /* (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4. */
239
53cd0ac6
KT
240#ifdef __ARM_FEATURE_SIMD32
241typedef int32_t int16x2_t;
242typedef uint32_t uint16x2_t;
243typedef int32_t int8x4_t;
244typedef uint32_t uint8x4_t;
245
246__extension__ extern __inline int16x2_t
247__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
248__sxtab16 (int16x2_t __a, int8x4_t __b)
249{
250 return __builtin_arm_sxtab16 (__a, __b);
251}
252
253__extension__ extern __inline int16x2_t
254__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
255__sxtb16 (int8x4_t __a)
256{
257 return __builtin_arm_sxtb16 (__a);
258}
259
260__extension__ extern __inline uint16x2_t
261__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
262__uxtab16 (uint16x2_t __a, uint8x4_t __b)
263{
264 return __builtin_arm_uxtab16 (__a, __b);
265}
266
267__extension__ extern __inline uint16x2_t
268__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
269__uxtb16 (uint8x4_t __a)
270{
271 return __builtin_arm_uxtb16 (__a);
272}
273
274__extension__ extern __inline int8x4_t
275__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
276__qadd8 (int8x4_t __a, int8x4_t __b)
277{
278 return __builtin_arm_qadd8 (__a, __b);
279}
280
281__extension__ extern __inline int8x4_t
282__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
283__qsub8 (int8x4_t __a, int8x4_t __b)
284{
285 return __builtin_arm_qsub8 (__a, __b);
286}
287
288__extension__ extern __inline int8x4_t
289__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
290__shadd8 (int8x4_t __a, int8x4_t __b)
291{
292 return __builtin_arm_shadd8 (__a, __b);
293}
294
295__extension__ extern __inline int8x4_t
296__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
297__shsub8 (int8x4_t __a, int8x4_t __b)
298{
299 return __builtin_arm_shsub8 (__a, __b);
300}
301
302__extension__ extern __inline uint8x4_t
303__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
304__uhadd8 (uint8x4_t __a, uint8x4_t __b)
305{
306 return __builtin_arm_uhadd8 (__a, __b);
307}
308
309__extension__ extern __inline uint8x4_t
310__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
311__uhsub8 (uint8x4_t __a, uint8x4_t __b)
312{
313 return __builtin_arm_uhsub8 (__a, __b);
314}
315
316__extension__ extern __inline uint8x4_t
317__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
318__uqadd8 (uint8x4_t __a, uint8x4_t __b)
319{
320 return __builtin_arm_uqadd8 (__a, __b);
321}
322
323__extension__ extern __inline uint8x4_t
324__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
325__uqsub8 (uint8x4_t __a, uint8x4_t __b)
326{
327 return __builtin_arm_uqsub8 (__a, __b);
328}
329
330__extension__ extern __inline int16x2_t
331__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
332__qadd16 (int16x2_t __a, int16x2_t __b)
333{
334 return __builtin_arm_qadd16 (__a, __b);
335}
336
337__extension__ extern __inline int16x2_t
338__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
339__qasx (int16x2_t __a, int16x2_t __b)
340{
341 return __builtin_arm_qasx (__a, __b);
342}
343
344__extension__ extern __inline int16x2_t
345__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
346__qsax (int16x2_t __a, int16x2_t __b)
347{
348 return __builtin_arm_qsax (__a, __b);
349}
350
351__extension__ extern __inline int16x2_t
352__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
353__qsub16 (int16x2_t __a, int16x2_t __b)
354{
355 return __builtin_arm_qsub16 (__a, __b);
356}
357
358__extension__ extern __inline int16x2_t
359__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
360__shadd16 (int16x2_t __a, int16x2_t __b)
361{
362 return __builtin_arm_shadd16 (__a, __b);
363}
364
365__extension__ extern __inline int16x2_t
366__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
367__shasx (int16x2_t __a, int16x2_t __b)
368{
369 return __builtin_arm_shasx (__a, __b);
370}
371
372__extension__ extern __inline int16x2_t
373__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
374__shsax (int16x2_t __a, int16x2_t __b)
375{
376 return __builtin_arm_shsax (__a, __b);
377}
378
379__extension__ extern __inline int16x2_t
380__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
381__shsub16 (int16x2_t __a, int16x2_t __b)
382{
383 return __builtin_arm_shsub16 (__a, __b);
384}
385
386__extension__ extern __inline uint16x2_t
387__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
388__uhadd16 (uint16x2_t __a, uint16x2_t __b)
389{
390 return __builtin_arm_uhadd16 (__a, __b);
391}
392
393__extension__ extern __inline uint16x2_t
394__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
395__uhasx (uint16x2_t __a, uint16x2_t __b)
396{
397 return __builtin_arm_uhasx (__a, __b);
398}
399
400__extension__ extern __inline uint16x2_t
401__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
402__uhsax (uint16x2_t __a, uint16x2_t __b)
403{
404 return __builtin_arm_uhsax (__a, __b);
405}
406
407__extension__ extern __inline uint16x2_t
408__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
409__uhsub16 (uint16x2_t __a, uint16x2_t __b)
410{
411 return __builtin_arm_uhsub16 (__a, __b);
412}
413
414__extension__ extern __inline uint16x2_t
415__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
416__uqadd16 (uint16x2_t __a, uint16x2_t __b)
417{
418 return __builtin_arm_uqadd16 (__a, __b);
419}
420
421__extension__ extern __inline uint16x2_t
422__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
423__uqasx (uint16x2_t __a, uint16x2_t __b)
424{
425 return __builtin_arm_uqasx (__a, __b);
426}
427
428__extension__ extern __inline uint16x2_t
429__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
430__uqsax (uint16x2_t __a, uint16x2_t __b)
431{
432 return __builtin_arm_uqsax (__a, __b);
433}
434
435__extension__ extern __inline uint16x2_t
436__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
437__uqsub16 (uint16x2_t __a, uint16x2_t __b)
438{
439 return __builtin_arm_uqsub16 (__a, __b);
440}
441
442__extension__ extern __inline int32_t
443__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
444__smusd (int16x2_t __a, int16x2_t __b)
445{
446 return __builtin_arm_smusd (__a, __b);
447}
448
449__extension__ extern __inline int32_t
450__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
451__smusdx (int16x2_t __a, int16x2_t __b)
452{
453 return __builtin_arm_smusdx (__a, __b);
454}
455
456__extension__ extern __inline uint32_t
457__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
458__usad8 (uint8x4_t __a, uint8x4_t __b)
459{
460 return __builtin_arm_usad8 (__a, __b);
461}
462
463__extension__ extern __inline uint32_t
464__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
465__usada8 (uint8x4_t __a, uint8x4_t __b, uint32_t __c)
466{
467 return __builtin_arm_usada8 (__a, __b, __c);
468}
469
2b5b5e24
KT
470__extension__ extern __inline int64_t
471__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
472__smlald (int16x2_t __a, int16x2_t __b, int64_t __c)
473{
474 return __builtin_arm_smlald (__a, __b, __c);
475}
476
477__extension__ extern __inline int64_t
478__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
479__smlaldx (int16x2_t __a, int16x2_t __b, int64_t __c)
480{
481 return __builtin_arm_smlaldx (__a, __b, __c);
482}
483
484__extension__ extern __inline int64_t
485__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
486__smlsld (int16x2_t __a, int16x2_t __b, int64_t __c)
487{
488 return __builtin_arm_smlsld (__a, __b, __c);
489}
490
491__extension__ extern __inline int64_t
492__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
493__smlsldx (int16x2_t __a, int16x2_t __b, int64_t __c)
494{
495 return __builtin_arm_smlsldx (__a, __b, __c);
496}
497
16155ccf
KT
498__extension__ extern __inline uint8x4_t
499__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
500__sel (uint8x4_t __a, uint8x4_t __b)
501{
502 return __builtin_arm_sel (__a, __b);
503}
504
505__extension__ extern __inline int8x4_t
506__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
507__sadd8 (int8x4_t __a, int8x4_t __b)
508{
509 return __builtin_arm_sadd8 (__a, __b);
510}
511
512__extension__ extern __inline int8x4_t
513__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
514__ssub8 (int8x4_t __a, int8x4_t __b)
515{
516 return __builtin_arm_ssub8 (__a, __b);
517}
518
519__extension__ extern __inline uint8x4_t
520__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
521__uadd8 (uint8x4_t __a, uint8x4_t __b)
522{
523 return __builtin_arm_uadd8 (__a, __b);
524}
525
526__extension__ extern __inline uint8x4_t
527__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
528__usub8 (uint8x4_t __a, uint8x4_t __b)
529{
530 return __builtin_arm_usub8 (__a, __b);
531}
532
533__extension__ extern __inline int16x2_t
534__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
535__sadd16 (int16x2_t __a, int16x2_t __b)
536{
537 return __builtin_arm_sadd16 (__a, __b);
538}
539
540__extension__ extern __inline int16x2_t
541__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
542__sasx (int16x2_t __a, int16x2_t __b)
543{
544 return __builtin_arm_sasx (__a, __b);
545}
546
547__extension__ extern __inline int16x2_t
548__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
549__ssax (int16x2_t __a, int16x2_t __b)
550{
551 return __builtin_arm_ssax (__a, __b);
552}
553
554__extension__ extern __inline int16x2_t
555__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
556__ssub16 (int16x2_t __a, int16x2_t __b)
557{
558 return __builtin_arm_ssub16 (__a, __b);
559}
560
561__extension__ extern __inline uint16x2_t
562__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
563__uadd16 (uint16x2_t __a, uint16x2_t __b)
564{
565 return __builtin_arm_uadd16 (__a, __b);
566}
567
568__extension__ extern __inline uint16x2_t
569__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
570__uasx (uint16x2_t __a, uint16x2_t __b)
571{
572 return __builtin_arm_uasx (__a, __b);
573}
574
575__extension__ extern __inline uint16x2_t
576__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
577__usax (uint16x2_t __a, uint16x2_t __b)
578{
579 return __builtin_arm_usax (__a, __b);
580}
581
582__extension__ extern __inline uint16x2_t
583__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
584__usub16 (uint16x2_t __a, uint16x2_t __b)
585{
586 return __builtin_arm_usub16 (__a, __b);
587}
588
65dd610d
KT
589__extension__ extern __inline int32_t
590__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
591__smlad (int16x2_t __a, int16x2_t __b, int32_t __c)
592{
593 return __builtin_arm_smlad (__a, __b, __c);
594}
595
596__extension__ extern __inline int32_t
597__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
598__smladx (int16x2_t __a, int16x2_t __b, int32_t __c)
599{
600 return __builtin_arm_smladx (__a, __b, __c);
601}
602
603__extension__ extern __inline int32_t
604__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
605__smlsd (int16x2_t __a, int16x2_t __b, int32_t __c)
606{
607 return __builtin_arm_smlsd (__a, __b, __c);
608}
609
610__extension__ extern __inline int32_t
611__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
612__smlsdx (int16x2_t __a, int16x2_t __b, int32_t __c)
613{
614 return __builtin_arm_smlsdx (__a, __b, __c);
615}
616
617__extension__ extern __inline int32_t
618__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
619__smuad (int16x2_t __a, int16x2_t __b)
620{
621 return __builtin_arm_smuad (__a, __b);
622}
623
624__extension__ extern __inline int32_t
625__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
626__smuadx (int16x2_t __a, int16x2_t __b)
627{
628 return __builtin_arm_smuadx (__a, __b);
629}
630
0775830a
KT
631#define __ssat16(__a, __sat) \
632 __extension__ \
633 ({ \
634 int16x2_t __arg = (__a); \
635 __builtin_sat_imm_check (__sat, 1, 16); \
636 int16x2_t __res = __builtin_arm_ssat16 (__arg, __sat); \
637 __res; \
638 })
639
640#define __usat16(__a, __sat) \
641 __extension__ \
642 ({ \
643 int16x2_t __arg = (__a); \
644 __builtin_sat_imm_check (__sat, 0, 15); \
645 int16x2_t __res = __builtin_arm_usat16 (__arg, __sat); \
646 __res; \
647 })
648
53cd0ac6
KT
649#endif
650
cf16f980
KT
651#ifdef __ARM_FEATURE_SAT
652
653#define __ssat(__a, __sat) \
654 __extension__ \
655 ({ \
656 int32_t __arg = (__a); \
657 __builtin_sat_imm_check (__sat, 1, 32); \
658 int32_t __res = __builtin_arm_ssat (__arg, __sat); \
659 __res; \
660 })
661
662#define __usat(__a, __sat) \
663 __extension__ \
664 ({ \
665 int32_t __arg = (__a); \
666 __builtin_sat_imm_check (__sat, 0, 31); \
667 uint32_t __res = __builtin_arm_usat (__arg, __sat); \
668 __res; \
669 })
670
671#endif
672
673#ifdef __ARM_FEATURE_QBIT
674__extension__ extern __inline void
675__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
676__ignore_saturation (void)
677{
678 /* ACLE designates this intrinsic as a hint.
679 Implement as a nop for now. */
680}
681
682/* These are defined as macros because the implementation of the builtins
683 requires easy access to the current function so wrapping it in an
684 always_inline function complicates things. */
685
686#define __saturation_occurred __builtin_arm_saturation_occurred
687
688#define __set_saturation_occurred(__a) \
689 __extension__ \
690 ({ \
691 int __arg = (__a); \
692 __builtin_arm_set_saturation (__arg); \
693 })
694#endif
2b5b5e24 695
e56d199b
KT
696#ifdef __ARM_FEATURE_DSP
697__extension__ extern __inline int32_t
698__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
699__qadd (int32_t __a, int32_t __b)
700{
701 return __builtin_arm_qadd (__a, __b);
702}
703
704__extension__ extern __inline int32_t
705__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
706__qsub (int32_t __a, int32_t __b)
707{
708 return __builtin_arm_qsub (__a, __b);
709}
710
711__extension__ extern __inline int32_t
712__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
713__qdbl (int32_t __x)
714{
715 return __qadd (__x, __x);
716}
08836731
KT
717
718__extension__ extern __inline int32_t
719__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
720__smlabb (int32_t __a, int32_t __b, int32_t __c)
721{
722 return __builtin_arm_smlabb (__a, __b, __c);
723}
724
725__extension__ extern __inline int32_t
726__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
727__smlatb (int32_t __a, int32_t __b, int32_t __c)
728{
729 return __builtin_arm_smlatb (__a, __b, __c);
730}
731
732/* smlatb is equivalent to smlabt with the two multiplication operands
733 swapped around. */
734__extension__ extern __inline int32_t
735__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
736__smlabt (int32_t __a, int32_t __b, int32_t __c)
737{
738 return __smlatb (__b, __a, __c);
739}
740
741__extension__ extern __inline int32_t
742__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
743__smlatt (int32_t __a, int32_t __b, int32_t __c)
744{
745 return __builtin_arm_smlatt (__a, __b, __c);
746}
747
748__extension__ extern __inline int32_t
749__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
750__smlawb (int32_t __a, int32_t __b, int32_t __c)
751{
752 return __builtin_arm_smlawb (__a, __b, __c);
753}
754
755__extension__ extern __inline int32_t
756__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
757__smlawt (int32_t __a, int32_t __b, int32_t __c)
758{
759 return __builtin_arm_smlawt (__a, __b, __c);
760}
e56d199b
KT
761#endif
762
ec132ef2 763#pragma GCC push_options
943766d3
KT
764#ifdef __ARM_FEATURE_CRC32
765#ifdef __ARM_FP
766#pragma GCC target ("arch=armv8-a+crc+simd")
767#else
ec132ef2 768#pragma GCC target ("arch=armv8-a+crc")
943766d3 769#endif
ec132ef2 770
582e2e43 771__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 772__crc32b (uint32_t __a, uint8_t __b)
582e2e43 773{
706f749a 774 return __builtin_arm_crc32b (__a, __b);
582e2e43
KT
775}
776
777__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 778__crc32h (uint32_t __a, uint16_t __b)
582e2e43 779{
706f749a 780 return __builtin_arm_crc32h (__a, __b);
582e2e43
KT
781}
782
783__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 784__crc32w (uint32_t __a, uint32_t __b)
582e2e43 785{
706f749a 786 return __builtin_arm_crc32w (__a, __b);
582e2e43
KT
787}
788
789#ifdef __ARM_32BIT_STATE
790__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 791__crc32d (uint32_t __a, uint64_t __b)
582e2e43 792{
706f749a 793 uint32_t __d;
582e2e43 794
706f749a
KT
795 __d = __crc32w (__crc32w (__a, __b & 0xffffffffULL), __b >> 32);
796 return __d;
582e2e43
KT
797}
798#endif
799
800__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 801__crc32cb (uint32_t __a, uint8_t __b)
582e2e43 802{
706f749a 803 return __builtin_arm_crc32cb (__a, __b);
582e2e43
KT
804}
805
806__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 807__crc32ch (uint32_t __a, uint16_t __b)
582e2e43 808{
706f749a 809 return __builtin_arm_crc32ch (__a, __b);
582e2e43
KT
810}
811
812__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 813__crc32cw (uint32_t __a, uint32_t __b)
582e2e43 814{
706f749a 815 return __builtin_arm_crc32cw (__a, __b);
582e2e43
KT
816}
817
818#ifdef __ARM_32BIT_STATE
819__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 820__crc32cd (uint32_t __a, uint64_t __b)
582e2e43 821{
706f749a 822 uint32_t __d;
582e2e43 823
706f749a
KT
824 __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32);
825 return __d;
582e2e43
KT
826}
827#endif
828
943766d3 829#endif /* __ARM_FEATURE_CRC32 */
ec132ef2 830#pragma GCC pop_options
582e2e43
KT
831
832#ifdef __cplusplus
833}
834#endif
835
836#endif