]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/arm_acle.h
[arm] Implement non-GE-setting SIMD32 intrinsics
[thirdparty/gcc.git] / gcc / config / arm / arm_acle.h
CommitLineData
582e2e43
KT
1/* ARM Non-NEON ACLE intrinsics include file.
2
a5544970 3 Copyright (C) 2013-2019 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
406#endif
407
ec132ef2 408#pragma GCC push_options
943766d3
KT
409#ifdef __ARM_FEATURE_CRC32
410#ifdef __ARM_FP
411#pragma GCC target ("arch=armv8-a+crc+simd")
412#else
ec132ef2 413#pragma GCC target ("arch=armv8-a+crc")
943766d3 414#endif
ec132ef2 415
582e2e43 416__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 417__crc32b (uint32_t __a, uint8_t __b)
582e2e43 418{
706f749a 419 return __builtin_arm_crc32b (__a, __b);
582e2e43
KT
420}
421
422__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 423__crc32h (uint32_t __a, uint16_t __b)
582e2e43 424{
706f749a 425 return __builtin_arm_crc32h (__a, __b);
582e2e43
KT
426}
427
428__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 429__crc32w (uint32_t __a, uint32_t __b)
582e2e43 430{
706f749a 431 return __builtin_arm_crc32w (__a, __b);
582e2e43
KT
432}
433
434#ifdef __ARM_32BIT_STATE
435__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 436__crc32d (uint32_t __a, uint64_t __b)
582e2e43 437{
706f749a 438 uint32_t __d;
582e2e43 439
706f749a
KT
440 __d = __crc32w (__crc32w (__a, __b & 0xffffffffULL), __b >> 32);
441 return __d;
582e2e43
KT
442}
443#endif
444
445__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 446__crc32cb (uint32_t __a, uint8_t __b)
582e2e43 447{
706f749a 448 return __builtin_arm_crc32cb (__a, __b);
582e2e43
KT
449}
450
451__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 452__crc32ch (uint32_t __a, uint16_t __b)
582e2e43 453{
706f749a 454 return __builtin_arm_crc32ch (__a, __b);
582e2e43
KT
455}
456
457__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 458__crc32cw (uint32_t __a, uint32_t __b)
582e2e43 459{
706f749a 460 return __builtin_arm_crc32cw (__a, __b);
582e2e43
KT
461}
462
463#ifdef __ARM_32BIT_STATE
464__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
706f749a 465__crc32cd (uint32_t __a, uint64_t __b)
582e2e43 466{
706f749a 467 uint32_t __d;
582e2e43 468
706f749a
KT
469 __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32);
470 return __d;
582e2e43
KT
471}
472#endif
473
943766d3 474#endif /* __ARM_FEATURE_CRC32 */
ec132ef2 475#pragma GCC pop_options
582e2e43
KT
476
477#ifdef __cplusplus
478}
479#endif
480
481#endif