Add assember CFI directives to millicode division and remainder routines.
[official-gcc.git] / gcc / config / arm / arm_acle.h
blob4a5a6a8161646f031e7adf132b242747e43b9a98
1 /* ARM Non-NEON ACLE intrinsics include file.
3 Copyright (C) 2013-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
30 #include <stdint.h>
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
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)
41 __builtin_arm_cdp (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2);
44 __extension__ static __inline void __attribute__ ((__always_inline__))
45 __arm_ldc (const unsigned int __coproc, const unsigned int __CRd,
46 const void * __p)
48 __builtin_arm_ldc (__coproc, __CRd, __p);
51 __extension__ static __inline void __attribute__ ((__always_inline__))
52 __arm_ldcl (const unsigned int __coproc, const unsigned int __CRd,
53 const void * __p)
55 __builtin_arm_ldcl (__coproc, __CRd, __p);
58 __extension__ static __inline void __attribute__ ((__always_inline__))
59 __arm_stc (const unsigned int __coproc, const unsigned int __CRd,
60 void * __p)
62 __builtin_arm_stc (__coproc, __CRd, __p);
65 __extension__ static __inline void __attribute__ ((__always_inline__))
66 __arm_stcl (const unsigned int __coproc, const unsigned int __CRd,
67 void * __p)
69 __builtin_arm_stcl (__coproc, __CRd, __p);
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)
77 __builtin_arm_mcr (__coproc, __opc1, __value, __CRn, __CRm, __opc2);
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)
85 return __builtin_arm_mrc (__coproc, __opc1, __CRn, __CRm, __opc2);
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)
93 __builtin_arm_cdp2 (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2);
96 __extension__ static __inline void __attribute__ ((__always_inline__))
97 __arm_ldc2 (const unsigned int __coproc, const unsigned int __CRd,
98 const void * __p)
100 __builtin_arm_ldc2 (__coproc, __CRd, __p);
103 __extension__ static __inline void __attribute__ ((__always_inline__))
104 __arm_ldc2l (const unsigned int __coproc, const unsigned int __CRd,
105 const void * __p)
107 __builtin_arm_ldc2l (__coproc, __CRd, __p);
110 __extension__ static __inline void __attribute__ ((__always_inline__))
111 __arm_stc2 (const unsigned int __coproc, const unsigned int __CRd,
112 void * __p)
114 __builtin_arm_stc2 (__coproc, __CRd, __p);
117 __extension__ static __inline void __attribute__ ((__always_inline__))
118 __arm_stc2l (const unsigned int __coproc, const unsigned int __CRd,
119 void * __p)
121 __builtin_arm_stc2l (__coproc, __CRd, __p);
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)
129 __builtin_arm_mcr2 (__coproc, __opc1, __value, __CRn, __CRm, __opc2);
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)
137 return __builtin_arm_mrc2 (__coproc, __opc1, __CRn, __CRm, __opc2);
140 #if __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__)
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)
146 __builtin_arm_mcrr (__coproc, __opc1, __value, __CRm);
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)
153 return __builtin_arm_mrrc (__coproc, __opc1, __CRm);
156 #if __ARM_ARCH >= 6
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)
162 __builtin_arm_mcrr2 (__coproc, __opc1, __value, __CRm);
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)
169 return __builtin_arm_mrrc2 (__coproc, __opc1, __CRm);
171 #endif /* __ARM_ARCH >= 6. */
172 #endif /* __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__). */
173 #endif /* __ARM_ARCH >= 5. */
174 #endif /* (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4. */
176 #ifdef __ARM_FEATURE_SIMD32
177 typedef int32_t int16x2_t;
178 typedef uint32_t uint16x2_t;
179 typedef int32_t int8x4_t;
180 typedef uint32_t uint8x4_t;
182 __extension__ extern __inline int16x2_t
183 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
184 __sxtab16 (int16x2_t __a, int8x4_t __b)
186 return __builtin_arm_sxtab16 (__a, __b);
189 __extension__ extern __inline int16x2_t
190 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
191 __sxtb16 (int8x4_t __a)
193 return __builtin_arm_sxtb16 (__a);
196 __extension__ extern __inline uint16x2_t
197 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
198 __uxtab16 (uint16x2_t __a, uint8x4_t __b)
200 return __builtin_arm_uxtab16 (__a, __b);
203 __extension__ extern __inline uint16x2_t
204 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
205 __uxtb16 (uint8x4_t __a)
207 return __builtin_arm_uxtb16 (__a);
210 __extension__ extern __inline int8x4_t
211 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
212 __qadd8 (int8x4_t __a, int8x4_t __b)
214 return __builtin_arm_qadd8 (__a, __b);
217 __extension__ extern __inline int8x4_t
218 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
219 __qsub8 (int8x4_t __a, int8x4_t __b)
221 return __builtin_arm_qsub8 (__a, __b);
224 __extension__ extern __inline int8x4_t
225 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
226 __shadd8 (int8x4_t __a, int8x4_t __b)
228 return __builtin_arm_shadd8 (__a, __b);
231 __extension__ extern __inline int8x4_t
232 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
233 __shsub8 (int8x4_t __a, int8x4_t __b)
235 return __builtin_arm_shsub8 (__a, __b);
238 __extension__ extern __inline uint8x4_t
239 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
240 __uhadd8 (uint8x4_t __a, uint8x4_t __b)
242 return __builtin_arm_uhadd8 (__a, __b);
245 __extension__ extern __inline uint8x4_t
246 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
247 __uhsub8 (uint8x4_t __a, uint8x4_t __b)
249 return __builtin_arm_uhsub8 (__a, __b);
252 __extension__ extern __inline uint8x4_t
253 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
254 __uqadd8 (uint8x4_t __a, uint8x4_t __b)
256 return __builtin_arm_uqadd8 (__a, __b);
259 __extension__ extern __inline uint8x4_t
260 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
261 __uqsub8 (uint8x4_t __a, uint8x4_t __b)
263 return __builtin_arm_uqsub8 (__a, __b);
266 __extension__ extern __inline int16x2_t
267 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
268 __qadd16 (int16x2_t __a, int16x2_t __b)
270 return __builtin_arm_qadd16 (__a, __b);
273 __extension__ extern __inline int16x2_t
274 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
275 __qasx (int16x2_t __a, int16x2_t __b)
277 return __builtin_arm_qasx (__a, __b);
280 __extension__ extern __inline int16x2_t
281 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
282 __qsax (int16x2_t __a, int16x2_t __b)
284 return __builtin_arm_qsax (__a, __b);
287 __extension__ extern __inline int16x2_t
288 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
289 __qsub16 (int16x2_t __a, int16x2_t __b)
291 return __builtin_arm_qsub16 (__a, __b);
294 __extension__ extern __inline int16x2_t
295 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
296 __shadd16 (int16x2_t __a, int16x2_t __b)
298 return __builtin_arm_shadd16 (__a, __b);
301 __extension__ extern __inline int16x2_t
302 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
303 __shasx (int16x2_t __a, int16x2_t __b)
305 return __builtin_arm_shasx (__a, __b);
308 __extension__ extern __inline int16x2_t
309 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
310 __shsax (int16x2_t __a, int16x2_t __b)
312 return __builtin_arm_shsax (__a, __b);
315 __extension__ extern __inline int16x2_t
316 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
317 __shsub16 (int16x2_t __a, int16x2_t __b)
319 return __builtin_arm_shsub16 (__a, __b);
322 __extension__ extern __inline uint16x2_t
323 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
324 __uhadd16 (uint16x2_t __a, uint16x2_t __b)
326 return __builtin_arm_uhadd16 (__a, __b);
329 __extension__ extern __inline uint16x2_t
330 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
331 __uhasx (uint16x2_t __a, uint16x2_t __b)
333 return __builtin_arm_uhasx (__a, __b);
336 __extension__ extern __inline uint16x2_t
337 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
338 __uhsax (uint16x2_t __a, uint16x2_t __b)
340 return __builtin_arm_uhsax (__a, __b);
343 __extension__ extern __inline uint16x2_t
344 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
345 __uhsub16 (uint16x2_t __a, uint16x2_t __b)
347 return __builtin_arm_uhsub16 (__a, __b);
350 __extension__ extern __inline uint16x2_t
351 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
352 __uqadd16 (uint16x2_t __a, uint16x2_t __b)
354 return __builtin_arm_uqadd16 (__a, __b);
357 __extension__ extern __inline uint16x2_t
358 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
359 __uqasx (uint16x2_t __a, uint16x2_t __b)
361 return __builtin_arm_uqasx (__a, __b);
364 __extension__ extern __inline uint16x2_t
365 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
366 __uqsax (uint16x2_t __a, uint16x2_t __b)
368 return __builtin_arm_uqsax (__a, __b);
371 __extension__ extern __inline uint16x2_t
372 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
373 __uqsub16 (uint16x2_t __a, uint16x2_t __b)
375 return __builtin_arm_uqsub16 (__a, __b);
378 __extension__ extern __inline int32_t
379 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
380 __smusd (int16x2_t __a, int16x2_t __b)
382 return __builtin_arm_smusd (__a, __b);
385 __extension__ extern __inline int32_t
386 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
387 __smusdx (int16x2_t __a, int16x2_t __b)
389 return __builtin_arm_smusdx (__a, __b);
392 __extension__ extern __inline uint32_t
393 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
394 __usad8 (uint8x4_t __a, uint8x4_t __b)
396 return __builtin_arm_usad8 (__a, __b);
399 __extension__ extern __inline uint32_t
400 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
401 __usada8 (uint8x4_t __a, uint8x4_t __b, uint32_t __c)
403 return __builtin_arm_usada8 (__a, __b, __c);
406 __extension__ extern __inline int64_t
407 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
408 __smlald (int16x2_t __a, int16x2_t __b, int64_t __c)
410 return __builtin_arm_smlald (__a, __b, __c);
413 __extension__ extern __inline int64_t
414 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
415 __smlaldx (int16x2_t __a, int16x2_t __b, int64_t __c)
417 return __builtin_arm_smlaldx (__a, __b, __c);
420 __extension__ extern __inline int64_t
421 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
422 __smlsld (int16x2_t __a, int16x2_t __b, int64_t __c)
424 return __builtin_arm_smlsld (__a, __b, __c);
427 __extension__ extern __inline int64_t
428 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
429 __smlsldx (int16x2_t __a, int16x2_t __b, int64_t __c)
431 return __builtin_arm_smlsldx (__a, __b, __c);
434 __extension__ extern __inline uint8x4_t
435 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
436 __sel (uint8x4_t __a, uint8x4_t __b)
438 return __builtin_arm_sel (__a, __b);
441 __extension__ extern __inline int8x4_t
442 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
443 __sadd8 (int8x4_t __a, int8x4_t __b)
445 return __builtin_arm_sadd8 (__a, __b);
448 __extension__ extern __inline int8x4_t
449 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
450 __ssub8 (int8x4_t __a, int8x4_t __b)
452 return __builtin_arm_ssub8 (__a, __b);
455 __extension__ extern __inline uint8x4_t
456 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
457 __uadd8 (uint8x4_t __a, uint8x4_t __b)
459 return __builtin_arm_uadd8 (__a, __b);
462 __extension__ extern __inline uint8x4_t
463 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
464 __usub8 (uint8x4_t __a, uint8x4_t __b)
466 return __builtin_arm_usub8 (__a, __b);
469 __extension__ extern __inline int16x2_t
470 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
471 __sadd16 (int16x2_t __a, int16x2_t __b)
473 return __builtin_arm_sadd16 (__a, __b);
476 __extension__ extern __inline int16x2_t
477 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
478 __sasx (int16x2_t __a, int16x2_t __b)
480 return __builtin_arm_sasx (__a, __b);
483 __extension__ extern __inline int16x2_t
484 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
485 __ssax (int16x2_t __a, int16x2_t __b)
487 return __builtin_arm_ssax (__a, __b);
490 __extension__ extern __inline int16x2_t
491 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
492 __ssub16 (int16x2_t __a, int16x2_t __b)
494 return __builtin_arm_ssub16 (__a, __b);
497 __extension__ extern __inline uint16x2_t
498 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
499 __uadd16 (uint16x2_t __a, uint16x2_t __b)
501 return __builtin_arm_uadd16 (__a, __b);
504 __extension__ extern __inline uint16x2_t
505 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
506 __uasx (uint16x2_t __a, uint16x2_t __b)
508 return __builtin_arm_uasx (__a, __b);
511 __extension__ extern __inline uint16x2_t
512 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
513 __usax (uint16x2_t __a, uint16x2_t __b)
515 return __builtin_arm_usax (__a, __b);
518 __extension__ extern __inline uint16x2_t
519 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
520 __usub16 (uint16x2_t __a, uint16x2_t __b)
522 return __builtin_arm_usub16 (__a, __b);
525 __extension__ extern __inline int32_t
526 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
527 __smlad (int16x2_t __a, int16x2_t __b, int32_t __c)
529 return __builtin_arm_smlad (__a, __b, __c);
532 __extension__ extern __inline int32_t
533 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
534 __smladx (int16x2_t __a, int16x2_t __b, int32_t __c)
536 return __builtin_arm_smladx (__a, __b, __c);
539 __extension__ extern __inline int32_t
540 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
541 __smlsd (int16x2_t __a, int16x2_t __b, int32_t __c)
543 return __builtin_arm_smlsd (__a, __b, __c);
546 __extension__ extern __inline int32_t
547 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
548 __smlsdx (int16x2_t __a, int16x2_t __b, int32_t __c)
550 return __builtin_arm_smlsdx (__a, __b, __c);
553 __extension__ extern __inline int32_t
554 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
555 __smuad (int16x2_t __a, int16x2_t __b)
557 return __builtin_arm_smuad (__a, __b);
560 __extension__ extern __inline int32_t
561 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
562 __smuadx (int16x2_t __a, int16x2_t __b)
564 return __builtin_arm_smuadx (__a, __b);
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; \
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; \
585 #endif
587 #ifdef __ARM_FEATURE_SAT
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; \
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; \
607 #endif
609 #ifdef __ARM_FEATURE_QBIT
610 __extension__ extern __inline void
611 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
612 __ignore_saturation (void)
614 /* ACLE designates this intrinsic as a hint.
615 Implement as a nop for now. */
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. */
622 #define __saturation_occurred __builtin_arm_saturation_occurred
624 #define __set_saturation_occurred(__a) \
625 __extension__ \
626 ({ \
627 int __arg = (__a); \
628 __builtin_arm_set_saturation (__arg); \
630 #endif
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)
637 return __builtin_arm_qadd (__a, __b);
640 __extension__ extern __inline int32_t
641 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
642 __qsub (int32_t __a, int32_t __b)
644 return __builtin_arm_qsub (__a, __b);
647 __extension__ extern __inline int32_t
648 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
649 __qdbl (int32_t __x)
651 return __qadd (__x, __x);
654 __extension__ extern __inline int32_t
655 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
656 __smlabb (int32_t __a, int32_t __b, int32_t __c)
658 return __builtin_arm_smlabb (__a, __b, __c);
661 __extension__ extern __inline int32_t
662 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
663 __smlatb (int32_t __a, int32_t __b, int32_t __c)
665 return __builtin_arm_smlatb (__a, __b, __c);
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)
674 return __smlatb (__b, __a, __c);
677 __extension__ extern __inline int32_t
678 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
679 __smlatt (int32_t __a, int32_t __b, int32_t __c)
681 return __builtin_arm_smlatt (__a, __b, __c);
684 __extension__ extern __inline int32_t
685 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
686 __smlawb (int32_t __a, int32_t __b, int32_t __c)
688 return __builtin_arm_smlawb (__a, __b, __c);
691 __extension__ extern __inline int32_t
692 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
693 __smlawt (int32_t __a, int32_t __b, int32_t __c)
695 return __builtin_arm_smlawt (__a, __b, __c);
697 #endif
699 #pragma GCC push_options
700 #ifdef __ARM_FEATURE_CRC32
701 #ifdef __ARM_FP
702 #pragma GCC target ("arch=armv8-a+crc+simd")
703 #else
704 #pragma GCC target ("arch=armv8-a+crc")
705 #endif
707 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
708 __crc32b (uint32_t __a, uint8_t __b)
710 return __builtin_arm_crc32b (__a, __b);
713 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
714 __crc32h (uint32_t __a, uint16_t __b)
716 return __builtin_arm_crc32h (__a, __b);
719 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
720 __crc32w (uint32_t __a, uint32_t __b)
722 return __builtin_arm_crc32w (__a, __b);
725 #ifdef __ARM_32BIT_STATE
726 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
727 __crc32d (uint32_t __a, uint64_t __b)
729 uint32_t __d;
731 __d = __crc32w (__crc32w (__a, __b & 0xffffffffULL), __b >> 32);
732 return __d;
734 #endif
736 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
737 __crc32cb (uint32_t __a, uint8_t __b)
739 return __builtin_arm_crc32cb (__a, __b);
742 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
743 __crc32ch (uint32_t __a, uint16_t __b)
745 return __builtin_arm_crc32ch (__a, __b);
748 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
749 __crc32cw (uint32_t __a, uint32_t __b)
751 return __builtin_arm_crc32cw (__a, __b);
754 #ifdef __ARM_32BIT_STATE
755 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
756 __crc32cd (uint32_t __a, uint64_t __b)
758 uint32_t __d;
760 __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32);
761 return __d;
763 #endif
765 #endif /* __ARM_FEATURE_CRC32 */
766 #pragma GCC pop_options
768 #ifdef __cplusplus
770 #endif
772 #endif