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