1*bed243d3SAndroid Build Coastguard Worker /*===---- arm_acle.h - ARM Non-Neon intrinsics -----------------------------===
2*bed243d3SAndroid Build Coastguard Worker *
3*bed243d3SAndroid Build Coastguard Worker * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bed243d3SAndroid Build Coastguard Worker * See https://llvm.org/LICENSE.txt for license information.
5*bed243d3SAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bed243d3SAndroid Build Coastguard Worker *
7*bed243d3SAndroid Build Coastguard Worker * The Arm C Language Extensions specifications can be found in the following
8*bed243d3SAndroid Build Coastguard Worker * link: https://github.com/ARM-software/acle/releases
9*bed243d3SAndroid Build Coastguard Worker *
10*bed243d3SAndroid Build Coastguard Worker * The ACLE section numbers are subject to change. When consulting the
11*bed243d3SAndroid Build Coastguard Worker * specifications, it is recommended to search using section titles if
12*bed243d3SAndroid Build Coastguard Worker * the section numbers look outdated.
13*bed243d3SAndroid Build Coastguard Worker *
14*bed243d3SAndroid Build Coastguard Worker *===-----------------------------------------------------------------------===
15*bed243d3SAndroid Build Coastguard Worker */
16*bed243d3SAndroid Build Coastguard Worker
17*bed243d3SAndroid Build Coastguard Worker #ifndef __ARM_ACLE_H
18*bed243d3SAndroid Build Coastguard Worker #define __ARM_ACLE_H
19*bed243d3SAndroid Build Coastguard Worker
20*bed243d3SAndroid Build Coastguard Worker #ifndef __ARM_ACLE
21*bed243d3SAndroid Build Coastguard Worker #error "ACLE intrinsics support not enabled."
22*bed243d3SAndroid Build Coastguard Worker #endif
23*bed243d3SAndroid Build Coastguard Worker
24*bed243d3SAndroid Build Coastguard Worker #include <stdint.h>
25*bed243d3SAndroid Build Coastguard Worker
26*bed243d3SAndroid Build Coastguard Worker #if defined(__cplusplus)
27*bed243d3SAndroid Build Coastguard Worker extern "C" {
28*bed243d3SAndroid Build Coastguard Worker #endif
29*bed243d3SAndroid Build Coastguard Worker
30*bed243d3SAndroid Build Coastguard Worker /* 7 SYNCHRONIZATION, BARRIER AND HINT INTRINSICS */
31*bed243d3SAndroid Build Coastguard Worker /* 7.3 Memory barriers */
32*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__dmb)
33*bed243d3SAndroid Build Coastguard Worker #define __dmb(i) __builtin_arm_dmb(i)
34*bed243d3SAndroid Build Coastguard Worker #endif
35*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__dsb)
36*bed243d3SAndroid Build Coastguard Worker #define __dsb(i) __builtin_arm_dsb(i)
37*bed243d3SAndroid Build Coastguard Worker #endif
38*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__isb)
39*bed243d3SAndroid Build Coastguard Worker #define __isb(i) __builtin_arm_isb(i)
40*bed243d3SAndroid Build Coastguard Worker #endif
41*bed243d3SAndroid Build Coastguard Worker
42*bed243d3SAndroid Build Coastguard Worker /* 7.4 Hints */
43*bed243d3SAndroid Build Coastguard Worker
44*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__wfi)
__wfi(void)45*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__)) __wfi(void) {
46*bed243d3SAndroid Build Coastguard Worker __builtin_arm_wfi();
47*bed243d3SAndroid Build Coastguard Worker }
48*bed243d3SAndroid Build Coastguard Worker #endif
49*bed243d3SAndroid Build Coastguard Worker
50*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__wfe)
__wfe(void)51*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__)) __wfe(void) {
52*bed243d3SAndroid Build Coastguard Worker __builtin_arm_wfe();
53*bed243d3SAndroid Build Coastguard Worker }
54*bed243d3SAndroid Build Coastguard Worker #endif
55*bed243d3SAndroid Build Coastguard Worker
56*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__sev)
__sev(void)57*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__)) __sev(void) {
58*bed243d3SAndroid Build Coastguard Worker __builtin_arm_sev();
59*bed243d3SAndroid Build Coastguard Worker }
60*bed243d3SAndroid Build Coastguard Worker #endif
61*bed243d3SAndroid Build Coastguard Worker
62*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__sevl)
__sevl(void)63*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__)) __sevl(void) {
64*bed243d3SAndroid Build Coastguard Worker __builtin_arm_sevl();
65*bed243d3SAndroid Build Coastguard Worker }
66*bed243d3SAndroid Build Coastguard Worker #endif
67*bed243d3SAndroid Build Coastguard Worker
68*bed243d3SAndroid Build Coastguard Worker #if !__has_builtin(__yield)
__yield(void)69*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__)) __yield(void) {
70*bed243d3SAndroid Build Coastguard Worker __builtin_arm_yield();
71*bed243d3SAndroid Build Coastguard Worker }
72*bed243d3SAndroid Build Coastguard Worker #endif
73*bed243d3SAndroid Build Coastguard Worker
74*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_32BIT_STATE) && __ARM_32BIT_STATE
75*bed243d3SAndroid Build Coastguard Worker #define __dbg(t) __builtin_arm_dbg(t)
76*bed243d3SAndroid Build Coastguard Worker #endif
77*bed243d3SAndroid Build Coastguard Worker
78*bed243d3SAndroid Build Coastguard Worker /* 7.5 Swap */
79*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__swp(uint32_t __x,volatile uint32_t * __p)80*bed243d3SAndroid Build Coastguard Worker __swp(uint32_t __x, volatile uint32_t *__p) {
81*bed243d3SAndroid Build Coastguard Worker uint32_t v;
82*bed243d3SAndroid Build Coastguard Worker do
83*bed243d3SAndroid Build Coastguard Worker v = __builtin_arm_ldrex(__p);
84*bed243d3SAndroid Build Coastguard Worker while (__builtin_arm_strex(__x, __p));
85*bed243d3SAndroid Build Coastguard Worker return v;
86*bed243d3SAndroid Build Coastguard Worker }
87*bed243d3SAndroid Build Coastguard Worker
88*bed243d3SAndroid Build Coastguard Worker /* 7.6 Memory prefetch intrinsics */
89*bed243d3SAndroid Build Coastguard Worker /* 7.6.1 Data prefetch */
90*bed243d3SAndroid Build Coastguard Worker #define __pld(addr) __pldx(0, 0, 0, addr)
91*bed243d3SAndroid Build Coastguard Worker
92*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_32BIT_STATE) && __ARM_32BIT_STATE
93*bed243d3SAndroid Build Coastguard Worker #define __pldx(access_kind, cache_level, retention_policy, addr) \
94*bed243d3SAndroid Build Coastguard Worker __builtin_arm_prefetch(addr, access_kind, 1)
95*bed243d3SAndroid Build Coastguard Worker #else
96*bed243d3SAndroid Build Coastguard Worker #define __pldx(access_kind, cache_level, retention_policy, addr) \
97*bed243d3SAndroid Build Coastguard Worker __builtin_arm_prefetch(addr, access_kind, cache_level, retention_policy, 1)
98*bed243d3SAndroid Build Coastguard Worker #endif
99*bed243d3SAndroid Build Coastguard Worker
100*bed243d3SAndroid Build Coastguard Worker /* 7.6.2 Instruction prefetch */
101*bed243d3SAndroid Build Coastguard Worker #define __pli(addr) __plix(0, 0, addr)
102*bed243d3SAndroid Build Coastguard Worker
103*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_32BIT_STATE) && __ARM_32BIT_STATE
104*bed243d3SAndroid Build Coastguard Worker #define __plix(cache_level, retention_policy, addr) \
105*bed243d3SAndroid Build Coastguard Worker __builtin_arm_prefetch(addr, 0, 0)
106*bed243d3SAndroid Build Coastguard Worker #else
107*bed243d3SAndroid Build Coastguard Worker #define __plix(cache_level, retention_policy, addr) \
108*bed243d3SAndroid Build Coastguard Worker __builtin_arm_prefetch(addr, 0, cache_level, retention_policy, 0)
109*bed243d3SAndroid Build Coastguard Worker #endif
110*bed243d3SAndroid Build Coastguard Worker
111*bed243d3SAndroid Build Coastguard Worker /* 7.7 NOP */
112*bed243d3SAndroid Build Coastguard Worker #if !defined(_MSC_VER) || !defined(__aarch64__)
__nop(void)113*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__)) __nop(void) {
114*bed243d3SAndroid Build Coastguard Worker __builtin_arm_nop();
115*bed243d3SAndroid Build Coastguard Worker }
116*bed243d3SAndroid Build Coastguard Worker #endif
117*bed243d3SAndroid Build Coastguard Worker
118*bed243d3SAndroid Build Coastguard Worker /* 8 DATA-PROCESSING INTRINSICS */
119*bed243d3SAndroid Build Coastguard Worker /* 8.2 Miscellaneous data-processing intrinsics */
120*bed243d3SAndroid Build Coastguard Worker /* ROR */
121*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__ror(uint32_t __x,uint32_t __y)122*bed243d3SAndroid Build Coastguard Worker __ror(uint32_t __x, uint32_t __y) {
123*bed243d3SAndroid Build Coastguard Worker __y %= 32;
124*bed243d3SAndroid Build Coastguard Worker if (__y == 0)
125*bed243d3SAndroid Build Coastguard Worker return __x;
126*bed243d3SAndroid Build Coastguard Worker return (__x >> __y) | (__x << (32 - __y));
127*bed243d3SAndroid Build Coastguard Worker }
128*bed243d3SAndroid Build Coastguard Worker
129*bed243d3SAndroid Build Coastguard Worker static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
__rorll(uint64_t __x,uint32_t __y)130*bed243d3SAndroid Build Coastguard Worker __rorll(uint64_t __x, uint32_t __y) {
131*bed243d3SAndroid Build Coastguard Worker __y %= 64;
132*bed243d3SAndroid Build Coastguard Worker if (__y == 0)
133*bed243d3SAndroid Build Coastguard Worker return __x;
134*bed243d3SAndroid Build Coastguard Worker return (__x >> __y) | (__x << (64 - __y));
135*bed243d3SAndroid Build Coastguard Worker }
136*bed243d3SAndroid Build Coastguard Worker
137*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))
__rorl(unsigned long __x,uint32_t __y)138*bed243d3SAndroid Build Coastguard Worker __rorl(unsigned long __x, uint32_t __y) {
139*bed243d3SAndroid Build Coastguard Worker #if __SIZEOF_LONG__ == 4
140*bed243d3SAndroid Build Coastguard Worker return __ror(__x, __y);
141*bed243d3SAndroid Build Coastguard Worker #else
142*bed243d3SAndroid Build Coastguard Worker return __rorll(__x, __y);
143*bed243d3SAndroid Build Coastguard Worker #endif
144*bed243d3SAndroid Build Coastguard Worker }
145*bed243d3SAndroid Build Coastguard Worker
146*bed243d3SAndroid Build Coastguard Worker
147*bed243d3SAndroid Build Coastguard Worker /* CLZ */
148*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
__clz(uint32_t __t)149*bed243d3SAndroid Build Coastguard Worker __clz(uint32_t __t) {
150*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_clz(__t);
151*bed243d3SAndroid Build Coastguard Worker }
152*bed243d3SAndroid Build Coastguard Worker
153*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
__clzl(unsigned long __t)154*bed243d3SAndroid Build Coastguard Worker __clzl(unsigned long __t) {
155*bed243d3SAndroid Build Coastguard Worker #if __SIZEOF_LONG__ == 4
156*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_clz(__t);
157*bed243d3SAndroid Build Coastguard Worker #else
158*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_clz64(__t);
159*bed243d3SAndroid Build Coastguard Worker #endif
160*bed243d3SAndroid Build Coastguard Worker }
161*bed243d3SAndroid Build Coastguard Worker
162*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
__clzll(uint64_t __t)163*bed243d3SAndroid Build Coastguard Worker __clzll(uint64_t __t) {
164*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_clz64(__t);
165*bed243d3SAndroid Build Coastguard Worker }
166*bed243d3SAndroid Build Coastguard Worker
167*bed243d3SAndroid Build Coastguard Worker /* CLS */
168*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
__cls(uint32_t __t)169*bed243d3SAndroid Build Coastguard Worker __cls(uint32_t __t) {
170*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_cls(__t);
171*bed243d3SAndroid Build Coastguard Worker }
172*bed243d3SAndroid Build Coastguard Worker
173*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
__clsl(unsigned long __t)174*bed243d3SAndroid Build Coastguard Worker __clsl(unsigned long __t) {
175*bed243d3SAndroid Build Coastguard Worker #if __SIZEOF_LONG__ == 4
176*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_cls(__t);
177*bed243d3SAndroid Build Coastguard Worker #else
178*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_cls64(__t);
179*bed243d3SAndroid Build Coastguard Worker #endif
180*bed243d3SAndroid Build Coastguard Worker }
181*bed243d3SAndroid Build Coastguard Worker
182*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
__clsll(uint64_t __t)183*bed243d3SAndroid Build Coastguard Worker __clsll(uint64_t __t) {
184*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_cls64(__t);
185*bed243d3SAndroid Build Coastguard Worker }
186*bed243d3SAndroid Build Coastguard Worker
187*bed243d3SAndroid Build Coastguard Worker /* REV */
188*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__rev(uint32_t __t)189*bed243d3SAndroid Build Coastguard Worker __rev(uint32_t __t) {
190*bed243d3SAndroid Build Coastguard Worker return __builtin_bswap32(__t);
191*bed243d3SAndroid Build Coastguard Worker }
192*bed243d3SAndroid Build Coastguard Worker
193*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))
__revl(unsigned long __t)194*bed243d3SAndroid Build Coastguard Worker __revl(unsigned long __t) {
195*bed243d3SAndroid Build Coastguard Worker #if __SIZEOF_LONG__ == 4
196*bed243d3SAndroid Build Coastguard Worker return __builtin_bswap32(__t);
197*bed243d3SAndroid Build Coastguard Worker #else
198*bed243d3SAndroid Build Coastguard Worker return __builtin_bswap64(__t);
199*bed243d3SAndroid Build Coastguard Worker #endif
200*bed243d3SAndroid Build Coastguard Worker }
201*bed243d3SAndroid Build Coastguard Worker
202*bed243d3SAndroid Build Coastguard Worker static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
__revll(uint64_t __t)203*bed243d3SAndroid Build Coastguard Worker __revll(uint64_t __t) {
204*bed243d3SAndroid Build Coastguard Worker return __builtin_bswap64(__t);
205*bed243d3SAndroid Build Coastguard Worker }
206*bed243d3SAndroid Build Coastguard Worker
207*bed243d3SAndroid Build Coastguard Worker /* REV16 */
208*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__rev16(uint32_t __t)209*bed243d3SAndroid Build Coastguard Worker __rev16(uint32_t __t) {
210*bed243d3SAndroid Build Coastguard Worker return __ror(__rev(__t), 16);
211*bed243d3SAndroid Build Coastguard Worker }
212*bed243d3SAndroid Build Coastguard Worker
213*bed243d3SAndroid Build Coastguard Worker static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
__rev16ll(uint64_t __t)214*bed243d3SAndroid Build Coastguard Worker __rev16ll(uint64_t __t) {
215*bed243d3SAndroid Build Coastguard Worker return (((uint64_t)__rev16(__t >> 32)) << 32) | (uint64_t)__rev16((uint32_t)__t);
216*bed243d3SAndroid Build Coastguard Worker }
217*bed243d3SAndroid Build Coastguard Worker
218*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))
__rev16l(unsigned long __t)219*bed243d3SAndroid Build Coastguard Worker __rev16l(unsigned long __t) {
220*bed243d3SAndroid Build Coastguard Worker #if __SIZEOF_LONG__ == 4
221*bed243d3SAndroid Build Coastguard Worker return __rev16(__t);
222*bed243d3SAndroid Build Coastguard Worker #else
223*bed243d3SAndroid Build Coastguard Worker return __rev16ll(__t);
224*bed243d3SAndroid Build Coastguard Worker #endif
225*bed243d3SAndroid Build Coastguard Worker }
226*bed243d3SAndroid Build Coastguard Worker
227*bed243d3SAndroid Build Coastguard Worker /* REVSH */
228*bed243d3SAndroid Build Coastguard Worker static __inline__ int16_t __attribute__((__always_inline__, __nodebug__))
__revsh(int16_t __t)229*bed243d3SAndroid Build Coastguard Worker __revsh(int16_t __t) {
230*bed243d3SAndroid Build Coastguard Worker return (int16_t)__builtin_bswap16((uint16_t)__t);
231*bed243d3SAndroid Build Coastguard Worker }
232*bed243d3SAndroid Build Coastguard Worker
233*bed243d3SAndroid Build Coastguard Worker /* RBIT */
234*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__rbit(uint32_t __t)235*bed243d3SAndroid Build Coastguard Worker __rbit(uint32_t __t) {
236*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rbit(__t);
237*bed243d3SAndroid Build Coastguard Worker }
238*bed243d3SAndroid Build Coastguard Worker
239*bed243d3SAndroid Build Coastguard Worker static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
__rbitll(uint64_t __t)240*bed243d3SAndroid Build Coastguard Worker __rbitll(uint64_t __t) {
241*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_32BIT_STATE) && __ARM_32BIT_STATE
242*bed243d3SAndroid Build Coastguard Worker return (((uint64_t)__builtin_arm_rbit(__t)) << 32) |
243*bed243d3SAndroid Build Coastguard Worker __builtin_arm_rbit(__t >> 32);
244*bed243d3SAndroid Build Coastguard Worker #else
245*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rbit64(__t);
246*bed243d3SAndroid Build Coastguard Worker #endif
247*bed243d3SAndroid Build Coastguard Worker }
248*bed243d3SAndroid Build Coastguard Worker
249*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))
__rbitl(unsigned long __t)250*bed243d3SAndroid Build Coastguard Worker __rbitl(unsigned long __t) {
251*bed243d3SAndroid Build Coastguard Worker #if __SIZEOF_LONG__ == 4
252*bed243d3SAndroid Build Coastguard Worker return __rbit(__t);
253*bed243d3SAndroid Build Coastguard Worker #else
254*bed243d3SAndroid Build Coastguard Worker return __rbitll(__t);
255*bed243d3SAndroid Build Coastguard Worker #endif
256*bed243d3SAndroid Build Coastguard Worker }
257*bed243d3SAndroid Build Coastguard Worker
258*bed243d3SAndroid Build Coastguard Worker /* 8.3 16-bit multiplications */
259*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_DSP) && __ARM_FEATURE_DSP
260*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__,__nodebug__))
__smulbb(int32_t __a,int32_t __b)261*bed243d3SAndroid Build Coastguard Worker __smulbb(int32_t __a, int32_t __b) {
262*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smulbb(__a, __b);
263*bed243d3SAndroid Build Coastguard Worker }
264*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__,__nodebug__))
__smulbt(int32_t __a,int32_t __b)265*bed243d3SAndroid Build Coastguard Worker __smulbt(int32_t __a, int32_t __b) {
266*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smulbt(__a, __b);
267*bed243d3SAndroid Build Coastguard Worker }
268*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__,__nodebug__))
__smultb(int32_t __a,int32_t __b)269*bed243d3SAndroid Build Coastguard Worker __smultb(int32_t __a, int32_t __b) {
270*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smultb(__a, __b);
271*bed243d3SAndroid Build Coastguard Worker }
272*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__,__nodebug__))
__smultt(int32_t __a,int32_t __b)273*bed243d3SAndroid Build Coastguard Worker __smultt(int32_t __a, int32_t __b) {
274*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smultt(__a, __b);
275*bed243d3SAndroid Build Coastguard Worker }
276*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__,__nodebug__))
__smulwb(int32_t __a,int32_t __b)277*bed243d3SAndroid Build Coastguard Worker __smulwb(int32_t __a, int32_t __b) {
278*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smulwb(__a, __b);
279*bed243d3SAndroid Build Coastguard Worker }
280*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__,__nodebug__))
__smulwt(int32_t __a,int32_t __b)281*bed243d3SAndroid Build Coastguard Worker __smulwt(int32_t __a, int32_t __b) {
282*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smulwt(__a, __b);
283*bed243d3SAndroid Build Coastguard Worker }
284*bed243d3SAndroid Build Coastguard Worker #endif
285*bed243d3SAndroid Build Coastguard Worker
286*bed243d3SAndroid Build Coastguard Worker /*
287*bed243d3SAndroid Build Coastguard Worker * 8.4 Saturating intrinsics
288*bed243d3SAndroid Build Coastguard Worker *
289*bed243d3SAndroid Build Coastguard Worker * FIXME: Change guard to their corresponding __ARM_FEATURE flag when Q flag
290*bed243d3SAndroid Build Coastguard Worker * intrinsics are implemented and the flag is enabled.
291*bed243d3SAndroid Build Coastguard Worker */
292*bed243d3SAndroid Build Coastguard Worker /* 8.4.1 Width-specified saturation intrinsics */
293*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SAT) && __ARM_FEATURE_SAT
294*bed243d3SAndroid Build Coastguard Worker #define __ssat(x, y) __builtin_arm_ssat(x, y)
295*bed243d3SAndroid Build Coastguard Worker #define __usat(x, y) __builtin_arm_usat(x, y)
296*bed243d3SAndroid Build Coastguard Worker #endif
297*bed243d3SAndroid Build Coastguard Worker
298*bed243d3SAndroid Build Coastguard Worker /* 8.4.2 Saturating addition and subtraction intrinsics */
299*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_DSP) && __ARM_FEATURE_DSP
300*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__qadd(int32_t __t,int32_t __v)301*bed243d3SAndroid Build Coastguard Worker __qadd(int32_t __t, int32_t __v) {
302*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qadd(__t, __v);
303*bed243d3SAndroid Build Coastguard Worker }
304*bed243d3SAndroid Build Coastguard Worker
305*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__qsub(int32_t __t,int32_t __v)306*bed243d3SAndroid Build Coastguard Worker __qsub(int32_t __t, int32_t __v) {
307*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qsub(__t, __v);
308*bed243d3SAndroid Build Coastguard Worker }
309*bed243d3SAndroid Build Coastguard Worker
310*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__qdbl(int32_t __t)311*bed243d3SAndroid Build Coastguard Worker __qdbl(int32_t __t) {
312*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qadd(__t, __t);
313*bed243d3SAndroid Build Coastguard Worker }
314*bed243d3SAndroid Build Coastguard Worker #endif
315*bed243d3SAndroid Build Coastguard Worker
316*bed243d3SAndroid Build Coastguard Worker /* 8.4.3 Accumulating multiplications */
317*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_DSP) && __ARM_FEATURE_DSP
318*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlabb(int32_t __a,int32_t __b,int32_t __c)319*bed243d3SAndroid Build Coastguard Worker __smlabb(int32_t __a, int32_t __b, int32_t __c) {
320*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlabb(__a, __b, __c);
321*bed243d3SAndroid Build Coastguard Worker }
322*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlabt(int32_t __a,int32_t __b,int32_t __c)323*bed243d3SAndroid Build Coastguard Worker __smlabt(int32_t __a, int32_t __b, int32_t __c) {
324*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlabt(__a, __b, __c);
325*bed243d3SAndroid Build Coastguard Worker }
326*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlatb(int32_t __a,int32_t __b,int32_t __c)327*bed243d3SAndroid Build Coastguard Worker __smlatb(int32_t __a, int32_t __b, int32_t __c) {
328*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlatb(__a, __b, __c);
329*bed243d3SAndroid Build Coastguard Worker }
330*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlatt(int32_t __a,int32_t __b,int32_t __c)331*bed243d3SAndroid Build Coastguard Worker __smlatt(int32_t __a, int32_t __b, int32_t __c) {
332*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlatt(__a, __b, __c);
333*bed243d3SAndroid Build Coastguard Worker }
334*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlawb(int32_t __a,int32_t __b,int32_t __c)335*bed243d3SAndroid Build Coastguard Worker __smlawb(int32_t __a, int32_t __b, int32_t __c) {
336*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlawb(__a, __b, __c);
337*bed243d3SAndroid Build Coastguard Worker }
338*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlawt(int32_t __a,int32_t __b,int32_t __c)339*bed243d3SAndroid Build Coastguard Worker __smlawt(int32_t __a, int32_t __b, int32_t __c) {
340*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlawt(__a, __b, __c);
341*bed243d3SAndroid Build Coastguard Worker }
342*bed243d3SAndroid Build Coastguard Worker #endif
343*bed243d3SAndroid Build Coastguard Worker
344*bed243d3SAndroid Build Coastguard Worker
345*bed243d3SAndroid Build Coastguard Worker /* 8.5.4 Parallel 16-bit saturation */
346*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SIMD32) && __ARM_FEATURE_SIMD32
347*bed243d3SAndroid Build Coastguard Worker #define __ssat16(x, y) __builtin_arm_ssat16(x, y)
348*bed243d3SAndroid Build Coastguard Worker #define __usat16(x, y) __builtin_arm_usat16(x, y)
349*bed243d3SAndroid Build Coastguard Worker #endif
350*bed243d3SAndroid Build Coastguard Worker
351*bed243d3SAndroid Build Coastguard Worker /* 8.5.5 Packing and unpacking */
352*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SIMD32) && __ARM_FEATURE_SIMD32
353*bed243d3SAndroid Build Coastguard Worker typedef int32_t int8x4_t;
354*bed243d3SAndroid Build Coastguard Worker typedef int32_t int16x2_t;
355*bed243d3SAndroid Build Coastguard Worker typedef uint32_t uint8x4_t;
356*bed243d3SAndroid Build Coastguard Worker typedef uint32_t uint16x2_t;
357*bed243d3SAndroid Build Coastguard Worker
358*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__sxtab16(int16x2_t __a,int8x4_t __b)359*bed243d3SAndroid Build Coastguard Worker __sxtab16(int16x2_t __a, int8x4_t __b) {
360*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_sxtab16(__a, __b);
361*bed243d3SAndroid Build Coastguard Worker }
362*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__sxtb16(int8x4_t __a)363*bed243d3SAndroid Build Coastguard Worker __sxtb16(int8x4_t __a) {
364*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_sxtb16(__a);
365*bed243d3SAndroid Build Coastguard Worker }
366*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__uxtab16(int16x2_t __a,int8x4_t __b)367*bed243d3SAndroid Build Coastguard Worker __uxtab16(int16x2_t __a, int8x4_t __b) {
368*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uxtab16(__a, __b);
369*bed243d3SAndroid Build Coastguard Worker }
370*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__uxtb16(int8x4_t __a)371*bed243d3SAndroid Build Coastguard Worker __uxtb16(int8x4_t __a) {
372*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uxtb16(__a);
373*bed243d3SAndroid Build Coastguard Worker }
374*bed243d3SAndroid Build Coastguard Worker #endif
375*bed243d3SAndroid Build Coastguard Worker
376*bed243d3SAndroid Build Coastguard Worker /* 8.5.6 Parallel selection */
377*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SIMD32) && __ARM_FEATURE_SIMD32
378*bed243d3SAndroid Build Coastguard Worker static __inline__ uint8x4_t __attribute__((__always_inline__, __nodebug__))
__sel(uint8x4_t __a,uint8x4_t __b)379*bed243d3SAndroid Build Coastguard Worker __sel(uint8x4_t __a, uint8x4_t __b) {
380*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_sel(__a, __b);
381*bed243d3SAndroid Build Coastguard Worker }
382*bed243d3SAndroid Build Coastguard Worker #endif
383*bed243d3SAndroid Build Coastguard Worker
384*bed243d3SAndroid Build Coastguard Worker /* 8.5.7 Parallel 8-bit addition and subtraction */
385*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SIMD32) && __ARM_FEATURE_SIMD32
386*bed243d3SAndroid Build Coastguard Worker static __inline__ int8x4_t __attribute__((__always_inline__, __nodebug__))
__qadd8(int8x4_t __a,int8x4_t __b)387*bed243d3SAndroid Build Coastguard Worker __qadd8(int8x4_t __a, int8x4_t __b) {
388*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qadd8(__a, __b);
389*bed243d3SAndroid Build Coastguard Worker }
390*bed243d3SAndroid Build Coastguard Worker static __inline__ int8x4_t __attribute__((__always_inline__, __nodebug__))
__qsub8(int8x4_t __a,int8x4_t __b)391*bed243d3SAndroid Build Coastguard Worker __qsub8(int8x4_t __a, int8x4_t __b) {
392*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qsub8(__a, __b);
393*bed243d3SAndroid Build Coastguard Worker }
394*bed243d3SAndroid Build Coastguard Worker static __inline__ int8x4_t __attribute__((__always_inline__, __nodebug__))
__sadd8(int8x4_t __a,int8x4_t __b)395*bed243d3SAndroid Build Coastguard Worker __sadd8(int8x4_t __a, int8x4_t __b) {
396*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_sadd8(__a, __b);
397*bed243d3SAndroid Build Coastguard Worker }
398*bed243d3SAndroid Build Coastguard Worker static __inline__ int8x4_t __attribute__((__always_inline__, __nodebug__))
__shadd8(int8x4_t __a,int8x4_t __b)399*bed243d3SAndroid Build Coastguard Worker __shadd8(int8x4_t __a, int8x4_t __b) {
400*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_shadd8(__a, __b);
401*bed243d3SAndroid Build Coastguard Worker }
402*bed243d3SAndroid Build Coastguard Worker static __inline__ int8x4_t __attribute__((__always_inline__, __nodebug__))
__shsub8(int8x4_t __a,int8x4_t __b)403*bed243d3SAndroid Build Coastguard Worker __shsub8(int8x4_t __a, int8x4_t __b) {
404*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_shsub8(__a, __b);
405*bed243d3SAndroid Build Coastguard Worker }
406*bed243d3SAndroid Build Coastguard Worker static __inline__ int8x4_t __attribute__((__always_inline__, __nodebug__))
__ssub8(int8x4_t __a,int8x4_t __b)407*bed243d3SAndroid Build Coastguard Worker __ssub8(int8x4_t __a, int8x4_t __b) {
408*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_ssub8(__a, __b);
409*bed243d3SAndroid Build Coastguard Worker }
410*bed243d3SAndroid Build Coastguard Worker static __inline__ uint8x4_t __attribute__((__always_inline__, __nodebug__))
__uadd8(uint8x4_t __a,uint8x4_t __b)411*bed243d3SAndroid Build Coastguard Worker __uadd8(uint8x4_t __a, uint8x4_t __b) {
412*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uadd8(__a, __b);
413*bed243d3SAndroid Build Coastguard Worker }
414*bed243d3SAndroid Build Coastguard Worker static __inline__ uint8x4_t __attribute__((__always_inline__, __nodebug__))
__uhadd8(uint8x4_t __a,uint8x4_t __b)415*bed243d3SAndroid Build Coastguard Worker __uhadd8(uint8x4_t __a, uint8x4_t __b) {
416*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uhadd8(__a, __b);
417*bed243d3SAndroid Build Coastguard Worker }
418*bed243d3SAndroid Build Coastguard Worker static __inline__ uint8x4_t __attribute__((__always_inline__, __nodebug__))
__uhsub8(uint8x4_t __a,uint8x4_t __b)419*bed243d3SAndroid Build Coastguard Worker __uhsub8(uint8x4_t __a, uint8x4_t __b) {
420*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uhsub8(__a, __b);
421*bed243d3SAndroid Build Coastguard Worker }
422*bed243d3SAndroid Build Coastguard Worker static __inline__ uint8x4_t __attribute__((__always_inline__, __nodebug__))
__uqadd8(uint8x4_t __a,uint8x4_t __b)423*bed243d3SAndroid Build Coastguard Worker __uqadd8(uint8x4_t __a, uint8x4_t __b) {
424*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uqadd8(__a, __b);
425*bed243d3SAndroid Build Coastguard Worker }
426*bed243d3SAndroid Build Coastguard Worker static __inline__ uint8x4_t __attribute__((__always_inline__, __nodebug__))
__uqsub8(uint8x4_t __a,uint8x4_t __b)427*bed243d3SAndroid Build Coastguard Worker __uqsub8(uint8x4_t __a, uint8x4_t __b) {
428*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uqsub8(__a, __b);
429*bed243d3SAndroid Build Coastguard Worker }
430*bed243d3SAndroid Build Coastguard Worker static __inline__ uint8x4_t __attribute__((__always_inline__, __nodebug__))
__usub8(uint8x4_t __a,uint8x4_t __b)431*bed243d3SAndroid Build Coastguard Worker __usub8(uint8x4_t __a, uint8x4_t __b) {
432*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_usub8(__a, __b);
433*bed243d3SAndroid Build Coastguard Worker }
434*bed243d3SAndroid Build Coastguard Worker #endif
435*bed243d3SAndroid Build Coastguard Worker
436*bed243d3SAndroid Build Coastguard Worker /* 8.5.8 Sum of 8-bit absolute differences */
437*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SIMD32) && __ARM_FEATURE_SIMD32
438*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__usad8(uint8x4_t __a,uint8x4_t __b)439*bed243d3SAndroid Build Coastguard Worker __usad8(uint8x4_t __a, uint8x4_t __b) {
440*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_usad8(__a, __b);
441*bed243d3SAndroid Build Coastguard Worker }
442*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__usada8(uint8x4_t __a,uint8x4_t __b,uint32_t __c)443*bed243d3SAndroid Build Coastguard Worker __usada8(uint8x4_t __a, uint8x4_t __b, uint32_t __c) {
444*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_usada8(__a, __b, __c);
445*bed243d3SAndroid Build Coastguard Worker }
446*bed243d3SAndroid Build Coastguard Worker #endif
447*bed243d3SAndroid Build Coastguard Worker
448*bed243d3SAndroid Build Coastguard Worker /* 8.5.9 Parallel 16-bit addition and subtraction */
449*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SIMD32) && __ARM_FEATURE_SIMD32
450*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__qadd16(int16x2_t __a,int16x2_t __b)451*bed243d3SAndroid Build Coastguard Worker __qadd16(int16x2_t __a, int16x2_t __b) {
452*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qadd16(__a, __b);
453*bed243d3SAndroid Build Coastguard Worker }
454*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__qasx(int16x2_t __a,int16x2_t __b)455*bed243d3SAndroid Build Coastguard Worker __qasx(int16x2_t __a, int16x2_t __b) {
456*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qasx(__a, __b);
457*bed243d3SAndroid Build Coastguard Worker }
458*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__qsax(int16x2_t __a,int16x2_t __b)459*bed243d3SAndroid Build Coastguard Worker __qsax(int16x2_t __a, int16x2_t __b) {
460*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qsax(__a, __b);
461*bed243d3SAndroid Build Coastguard Worker }
462*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__qsub16(int16x2_t __a,int16x2_t __b)463*bed243d3SAndroid Build Coastguard Worker __qsub16(int16x2_t __a, int16x2_t __b) {
464*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_qsub16(__a, __b);
465*bed243d3SAndroid Build Coastguard Worker }
466*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__sadd16(int16x2_t __a,int16x2_t __b)467*bed243d3SAndroid Build Coastguard Worker __sadd16(int16x2_t __a, int16x2_t __b) {
468*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_sadd16(__a, __b);
469*bed243d3SAndroid Build Coastguard Worker }
470*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__sasx(int16x2_t __a,int16x2_t __b)471*bed243d3SAndroid Build Coastguard Worker __sasx(int16x2_t __a, int16x2_t __b) {
472*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_sasx(__a, __b);
473*bed243d3SAndroid Build Coastguard Worker }
474*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__shadd16(int16x2_t __a,int16x2_t __b)475*bed243d3SAndroid Build Coastguard Worker __shadd16(int16x2_t __a, int16x2_t __b) {
476*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_shadd16(__a, __b);
477*bed243d3SAndroid Build Coastguard Worker }
478*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__shasx(int16x2_t __a,int16x2_t __b)479*bed243d3SAndroid Build Coastguard Worker __shasx(int16x2_t __a, int16x2_t __b) {
480*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_shasx(__a, __b);
481*bed243d3SAndroid Build Coastguard Worker }
482*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__shsax(int16x2_t __a,int16x2_t __b)483*bed243d3SAndroid Build Coastguard Worker __shsax(int16x2_t __a, int16x2_t __b) {
484*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_shsax(__a, __b);
485*bed243d3SAndroid Build Coastguard Worker }
486*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__shsub16(int16x2_t __a,int16x2_t __b)487*bed243d3SAndroid Build Coastguard Worker __shsub16(int16x2_t __a, int16x2_t __b) {
488*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_shsub16(__a, __b);
489*bed243d3SAndroid Build Coastguard Worker }
490*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__ssax(int16x2_t __a,int16x2_t __b)491*bed243d3SAndroid Build Coastguard Worker __ssax(int16x2_t __a, int16x2_t __b) {
492*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_ssax(__a, __b);
493*bed243d3SAndroid Build Coastguard Worker }
494*bed243d3SAndroid Build Coastguard Worker static __inline__ int16x2_t __attribute__((__always_inline__, __nodebug__))
__ssub16(int16x2_t __a,int16x2_t __b)495*bed243d3SAndroid Build Coastguard Worker __ssub16(int16x2_t __a, int16x2_t __b) {
496*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_ssub16(__a, __b);
497*bed243d3SAndroid Build Coastguard Worker }
498*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uadd16(uint16x2_t __a,uint16x2_t __b)499*bed243d3SAndroid Build Coastguard Worker __uadd16(uint16x2_t __a, uint16x2_t __b) {
500*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uadd16(__a, __b);
501*bed243d3SAndroid Build Coastguard Worker }
502*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uasx(uint16x2_t __a,uint16x2_t __b)503*bed243d3SAndroid Build Coastguard Worker __uasx(uint16x2_t __a, uint16x2_t __b) {
504*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uasx(__a, __b);
505*bed243d3SAndroid Build Coastguard Worker }
506*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uhadd16(uint16x2_t __a,uint16x2_t __b)507*bed243d3SAndroid Build Coastguard Worker __uhadd16(uint16x2_t __a, uint16x2_t __b) {
508*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uhadd16(__a, __b);
509*bed243d3SAndroid Build Coastguard Worker }
510*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uhasx(uint16x2_t __a,uint16x2_t __b)511*bed243d3SAndroid Build Coastguard Worker __uhasx(uint16x2_t __a, uint16x2_t __b) {
512*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uhasx(__a, __b);
513*bed243d3SAndroid Build Coastguard Worker }
514*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uhsax(uint16x2_t __a,uint16x2_t __b)515*bed243d3SAndroid Build Coastguard Worker __uhsax(uint16x2_t __a, uint16x2_t __b) {
516*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uhsax(__a, __b);
517*bed243d3SAndroid Build Coastguard Worker }
518*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uhsub16(uint16x2_t __a,uint16x2_t __b)519*bed243d3SAndroid Build Coastguard Worker __uhsub16(uint16x2_t __a, uint16x2_t __b) {
520*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uhsub16(__a, __b);
521*bed243d3SAndroid Build Coastguard Worker }
522*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uqadd16(uint16x2_t __a,uint16x2_t __b)523*bed243d3SAndroid Build Coastguard Worker __uqadd16(uint16x2_t __a, uint16x2_t __b) {
524*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uqadd16(__a, __b);
525*bed243d3SAndroid Build Coastguard Worker }
526*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uqasx(uint16x2_t __a,uint16x2_t __b)527*bed243d3SAndroid Build Coastguard Worker __uqasx(uint16x2_t __a, uint16x2_t __b) {
528*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uqasx(__a, __b);
529*bed243d3SAndroid Build Coastguard Worker }
530*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uqsax(uint16x2_t __a,uint16x2_t __b)531*bed243d3SAndroid Build Coastguard Worker __uqsax(uint16x2_t __a, uint16x2_t __b) {
532*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uqsax(__a, __b);
533*bed243d3SAndroid Build Coastguard Worker }
534*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__uqsub16(uint16x2_t __a,uint16x2_t __b)535*bed243d3SAndroid Build Coastguard Worker __uqsub16(uint16x2_t __a, uint16x2_t __b) {
536*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_uqsub16(__a, __b);
537*bed243d3SAndroid Build Coastguard Worker }
538*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__usax(uint16x2_t __a,uint16x2_t __b)539*bed243d3SAndroid Build Coastguard Worker __usax(uint16x2_t __a, uint16x2_t __b) {
540*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_usax(__a, __b);
541*bed243d3SAndroid Build Coastguard Worker }
542*bed243d3SAndroid Build Coastguard Worker static __inline__ uint16x2_t __attribute__((__always_inline__, __nodebug__))
__usub16(uint16x2_t __a,uint16x2_t __b)543*bed243d3SAndroid Build Coastguard Worker __usub16(uint16x2_t __a, uint16x2_t __b) {
544*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_usub16(__a, __b);
545*bed243d3SAndroid Build Coastguard Worker }
546*bed243d3SAndroid Build Coastguard Worker #endif
547*bed243d3SAndroid Build Coastguard Worker
548*bed243d3SAndroid Build Coastguard Worker /* 8.5.10 Parallel 16-bit multiplication */
549*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_SIMD32) && __ARM_FEATURE_SIMD32
550*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlad(int16x2_t __a,int16x2_t __b,int32_t __c)551*bed243d3SAndroid Build Coastguard Worker __smlad(int16x2_t __a, int16x2_t __b, int32_t __c) {
552*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlad(__a, __b, __c);
553*bed243d3SAndroid Build Coastguard Worker }
554*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smladx(int16x2_t __a,int16x2_t __b,int32_t __c)555*bed243d3SAndroid Build Coastguard Worker __smladx(int16x2_t __a, int16x2_t __b, int32_t __c) {
556*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smladx(__a, __b, __c);
557*bed243d3SAndroid Build Coastguard Worker }
558*bed243d3SAndroid Build Coastguard Worker static __inline__ int64_t __attribute__((__always_inline__, __nodebug__))
__smlald(int16x2_t __a,int16x2_t __b,int64_t __c)559*bed243d3SAndroid Build Coastguard Worker __smlald(int16x2_t __a, int16x2_t __b, int64_t __c) {
560*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlald(__a, __b, __c);
561*bed243d3SAndroid Build Coastguard Worker }
562*bed243d3SAndroid Build Coastguard Worker static __inline__ int64_t __attribute__((__always_inline__, __nodebug__))
__smlaldx(int16x2_t __a,int16x2_t __b,int64_t __c)563*bed243d3SAndroid Build Coastguard Worker __smlaldx(int16x2_t __a, int16x2_t __b, int64_t __c) {
564*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlaldx(__a, __b, __c);
565*bed243d3SAndroid Build Coastguard Worker }
566*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlsd(int16x2_t __a,int16x2_t __b,int32_t __c)567*bed243d3SAndroid Build Coastguard Worker __smlsd(int16x2_t __a, int16x2_t __b, int32_t __c) {
568*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlsd(__a, __b, __c);
569*bed243d3SAndroid Build Coastguard Worker }
570*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smlsdx(int16x2_t __a,int16x2_t __b,int32_t __c)571*bed243d3SAndroid Build Coastguard Worker __smlsdx(int16x2_t __a, int16x2_t __b, int32_t __c) {
572*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlsdx(__a, __b, __c);
573*bed243d3SAndroid Build Coastguard Worker }
574*bed243d3SAndroid Build Coastguard Worker static __inline__ int64_t __attribute__((__always_inline__, __nodebug__))
__smlsld(int16x2_t __a,int16x2_t __b,int64_t __c)575*bed243d3SAndroid Build Coastguard Worker __smlsld(int16x2_t __a, int16x2_t __b, int64_t __c) {
576*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlsld(__a, __b, __c);
577*bed243d3SAndroid Build Coastguard Worker }
578*bed243d3SAndroid Build Coastguard Worker static __inline__ int64_t __attribute__((__always_inline__, __nodebug__))
__smlsldx(int16x2_t __a,int16x2_t __b,int64_t __c)579*bed243d3SAndroid Build Coastguard Worker __smlsldx(int16x2_t __a, int16x2_t __b, int64_t __c) {
580*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smlsldx(__a, __b, __c);
581*bed243d3SAndroid Build Coastguard Worker }
582*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smuad(int16x2_t __a,int16x2_t __b)583*bed243d3SAndroid Build Coastguard Worker __smuad(int16x2_t __a, int16x2_t __b) {
584*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smuad(__a, __b);
585*bed243d3SAndroid Build Coastguard Worker }
586*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smuadx(int16x2_t __a,int16x2_t __b)587*bed243d3SAndroid Build Coastguard Worker __smuadx(int16x2_t __a, int16x2_t __b) {
588*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smuadx(__a, __b);
589*bed243d3SAndroid Build Coastguard Worker }
590*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smusd(int16x2_t __a,int16x2_t __b)591*bed243d3SAndroid Build Coastguard Worker __smusd(int16x2_t __a, int16x2_t __b) {
592*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smusd(__a, __b);
593*bed243d3SAndroid Build Coastguard Worker }
594*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))
__smusdx(int16x2_t __a,int16x2_t __b)595*bed243d3SAndroid Build Coastguard Worker __smusdx(int16x2_t __a, int16x2_t __b) {
596*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_smusdx(__a, __b);
597*bed243d3SAndroid Build Coastguard Worker }
598*bed243d3SAndroid Build Coastguard Worker #endif
599*bed243d3SAndroid Build Coastguard Worker
600*bed243d3SAndroid Build Coastguard Worker /* 8.6 Floating-point data-processing intrinsics */
601*bed243d3SAndroid Build Coastguard Worker #if (defined(__ARM_FEATURE_DIRECTED_ROUNDING) && \
602*bed243d3SAndroid Build Coastguard Worker (__ARM_FEATURE_DIRECTED_ROUNDING)) && \
603*bed243d3SAndroid Build Coastguard Worker (defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE)
604*bed243d3SAndroid Build Coastguard Worker static __inline__ double __attribute__((__always_inline__, __nodebug__))
__rintn(double __a)605*bed243d3SAndroid Build Coastguard Worker __rintn(double __a) {
606*bed243d3SAndroid Build Coastguard Worker return __builtin_roundeven(__a);
607*bed243d3SAndroid Build Coastguard Worker }
608*bed243d3SAndroid Build Coastguard Worker
609*bed243d3SAndroid Build Coastguard Worker static __inline__ float __attribute__((__always_inline__, __nodebug__))
__rintnf(float __a)610*bed243d3SAndroid Build Coastguard Worker __rintnf(float __a) {
611*bed243d3SAndroid Build Coastguard Worker return __builtin_roundevenf(__a);
612*bed243d3SAndroid Build Coastguard Worker }
613*bed243d3SAndroid Build Coastguard Worker #endif
614*bed243d3SAndroid Build Coastguard Worker
615*bed243d3SAndroid Build Coastguard Worker /* 8.8 CRC32 intrinsics */
616*bed243d3SAndroid Build Coastguard Worker #if (defined(__ARM_FEATURE_CRC32) && __ARM_FEATURE_CRC32) || \
617*bed243d3SAndroid Build Coastguard Worker (defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE)
618*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32b(uint32_t __a,uint8_t __b)619*bed243d3SAndroid Build Coastguard Worker __crc32b(uint32_t __a, uint8_t __b) {
620*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32b(__a, __b);
621*bed243d3SAndroid Build Coastguard Worker }
622*bed243d3SAndroid Build Coastguard Worker
623*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32h(uint32_t __a,uint16_t __b)624*bed243d3SAndroid Build Coastguard Worker __crc32h(uint32_t __a, uint16_t __b) {
625*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32h(__a, __b);
626*bed243d3SAndroid Build Coastguard Worker }
627*bed243d3SAndroid Build Coastguard Worker
628*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32w(uint32_t __a,uint32_t __b)629*bed243d3SAndroid Build Coastguard Worker __crc32w(uint32_t __a, uint32_t __b) {
630*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32w(__a, __b);
631*bed243d3SAndroid Build Coastguard Worker }
632*bed243d3SAndroid Build Coastguard Worker
633*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32d(uint32_t __a,uint64_t __b)634*bed243d3SAndroid Build Coastguard Worker __crc32d(uint32_t __a, uint64_t __b) {
635*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32d(__a, __b);
636*bed243d3SAndroid Build Coastguard Worker }
637*bed243d3SAndroid Build Coastguard Worker
638*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32cb(uint32_t __a,uint8_t __b)639*bed243d3SAndroid Build Coastguard Worker __crc32cb(uint32_t __a, uint8_t __b) {
640*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32cb(__a, __b);
641*bed243d3SAndroid Build Coastguard Worker }
642*bed243d3SAndroid Build Coastguard Worker
643*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32ch(uint32_t __a,uint16_t __b)644*bed243d3SAndroid Build Coastguard Worker __crc32ch(uint32_t __a, uint16_t __b) {
645*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32ch(__a, __b);
646*bed243d3SAndroid Build Coastguard Worker }
647*bed243d3SAndroid Build Coastguard Worker
648*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32cw(uint32_t __a,uint32_t __b)649*bed243d3SAndroid Build Coastguard Worker __crc32cw(uint32_t __a, uint32_t __b) {
650*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32cw(__a, __b);
651*bed243d3SAndroid Build Coastguard Worker }
652*bed243d3SAndroid Build Coastguard Worker
653*bed243d3SAndroid Build Coastguard Worker static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__, target("crc")))
__crc32cd(uint32_t __a,uint64_t __b)654*bed243d3SAndroid Build Coastguard Worker __crc32cd(uint32_t __a, uint64_t __b) {
655*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_crc32cd(__a, __b);
656*bed243d3SAndroid Build Coastguard Worker }
657*bed243d3SAndroid Build Coastguard Worker #endif
658*bed243d3SAndroid Build Coastguard Worker
659*bed243d3SAndroid Build Coastguard Worker /* 8.6 Floating-point data-processing intrinsics */
660*bed243d3SAndroid Build Coastguard Worker /* Armv8.3-A Javascript conversion intrinsic */
661*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE
662*bed243d3SAndroid Build Coastguard Worker static __inline__ int32_t __attribute__((__always_inline__, __nodebug__, target("v8.3a")))
__jcvt(double __a)663*bed243d3SAndroid Build Coastguard Worker __jcvt(double __a) {
664*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_jcvt(__a);
665*bed243d3SAndroid Build Coastguard Worker }
666*bed243d3SAndroid Build Coastguard Worker #endif
667*bed243d3SAndroid Build Coastguard Worker
668*bed243d3SAndroid Build Coastguard Worker /* Armv8.5-A FP rounding intrinsics */
669*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE
670*bed243d3SAndroid Build Coastguard Worker static __inline__ float __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint32zf(float __a)671*bed243d3SAndroid Build Coastguard Worker __rint32zf(float __a) {
672*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint32zf(__a);
673*bed243d3SAndroid Build Coastguard Worker }
674*bed243d3SAndroid Build Coastguard Worker
675*bed243d3SAndroid Build Coastguard Worker static __inline__ double __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint32z(double __a)676*bed243d3SAndroid Build Coastguard Worker __rint32z(double __a) {
677*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint32z(__a);
678*bed243d3SAndroid Build Coastguard Worker }
679*bed243d3SAndroid Build Coastguard Worker
680*bed243d3SAndroid Build Coastguard Worker static __inline__ float __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint64zf(float __a)681*bed243d3SAndroid Build Coastguard Worker __rint64zf(float __a) {
682*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint64zf(__a);
683*bed243d3SAndroid Build Coastguard Worker }
684*bed243d3SAndroid Build Coastguard Worker
685*bed243d3SAndroid Build Coastguard Worker static __inline__ double __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint64z(double __a)686*bed243d3SAndroid Build Coastguard Worker __rint64z(double __a) {
687*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint64z(__a);
688*bed243d3SAndroid Build Coastguard Worker }
689*bed243d3SAndroid Build Coastguard Worker
690*bed243d3SAndroid Build Coastguard Worker static __inline__ float __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint32xf(float __a)691*bed243d3SAndroid Build Coastguard Worker __rint32xf(float __a) {
692*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint32xf(__a);
693*bed243d3SAndroid Build Coastguard Worker }
694*bed243d3SAndroid Build Coastguard Worker
695*bed243d3SAndroid Build Coastguard Worker static __inline__ double __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint32x(double __a)696*bed243d3SAndroid Build Coastguard Worker __rint32x(double __a) {
697*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint32x(__a);
698*bed243d3SAndroid Build Coastguard Worker }
699*bed243d3SAndroid Build Coastguard Worker
700*bed243d3SAndroid Build Coastguard Worker static __inline__ float __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint64xf(float __a)701*bed243d3SAndroid Build Coastguard Worker __rint64xf(float __a) {
702*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint64xf(__a);
703*bed243d3SAndroid Build Coastguard Worker }
704*bed243d3SAndroid Build Coastguard Worker
705*bed243d3SAndroid Build Coastguard Worker static __inline__ double __attribute__((__always_inline__, __nodebug__, target("v8.5a")))
__rint64x(double __a)706*bed243d3SAndroid Build Coastguard Worker __rint64x(double __a) {
707*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rint64x(__a);
708*bed243d3SAndroid Build Coastguard Worker }
709*bed243d3SAndroid Build Coastguard Worker #endif
710*bed243d3SAndroid Build Coastguard Worker
711*bed243d3SAndroid Build Coastguard Worker /* 8.9 Armv8.7-A load/store 64-byte intrinsics */
712*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE
713*bed243d3SAndroid Build Coastguard Worker typedef struct {
714*bed243d3SAndroid Build Coastguard Worker uint64_t val[8];
715*bed243d3SAndroid Build Coastguard Worker } data512_t;
716*bed243d3SAndroid Build Coastguard Worker
717*bed243d3SAndroid Build Coastguard Worker static __inline__ data512_t __attribute__((__always_inline__, __nodebug__, target("ls64")))
__arm_ld64b(const void * __addr)718*bed243d3SAndroid Build Coastguard Worker __arm_ld64b(const void *__addr) {
719*bed243d3SAndroid Build Coastguard Worker data512_t __value;
720*bed243d3SAndroid Build Coastguard Worker __builtin_arm_ld64b(__addr, __value.val);
721*bed243d3SAndroid Build Coastguard Worker return __value;
722*bed243d3SAndroid Build Coastguard Worker }
723*bed243d3SAndroid Build Coastguard Worker static __inline__ void __attribute__((__always_inline__, __nodebug__, target("ls64")))
__arm_st64b(void * __addr,data512_t __value)724*bed243d3SAndroid Build Coastguard Worker __arm_st64b(void *__addr, data512_t __value) {
725*bed243d3SAndroid Build Coastguard Worker __builtin_arm_st64b(__addr, __value.val);
726*bed243d3SAndroid Build Coastguard Worker }
727*bed243d3SAndroid Build Coastguard Worker static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__, target("ls64")))
__arm_st64bv(void * __addr,data512_t __value)728*bed243d3SAndroid Build Coastguard Worker __arm_st64bv(void *__addr, data512_t __value) {
729*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_st64bv(__addr, __value.val);
730*bed243d3SAndroid Build Coastguard Worker }
731*bed243d3SAndroid Build Coastguard Worker static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__, target("ls64")))
__arm_st64bv0(void * __addr,data512_t __value)732*bed243d3SAndroid Build Coastguard Worker __arm_st64bv0(void *__addr, data512_t __value) {
733*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_st64bv0(__addr, __value.val);
734*bed243d3SAndroid Build Coastguard Worker }
735*bed243d3SAndroid Build Coastguard Worker #endif
736*bed243d3SAndroid Build Coastguard Worker
737*bed243d3SAndroid Build Coastguard Worker /* 11.1 Special register intrinsics */
738*bed243d3SAndroid Build Coastguard Worker #define __arm_rsr(sysreg) __builtin_arm_rsr(sysreg)
739*bed243d3SAndroid Build Coastguard Worker #define __arm_rsr64(sysreg) __builtin_arm_rsr64(sysreg)
740*bed243d3SAndroid Build Coastguard Worker #define __arm_rsr128(sysreg) __builtin_arm_rsr128(sysreg)
741*bed243d3SAndroid Build Coastguard Worker #define __arm_rsrp(sysreg) __builtin_arm_rsrp(sysreg)
742*bed243d3SAndroid Build Coastguard Worker #define __arm_rsrf(sysreg) __builtin_bit_cast(float, __arm_rsr(sysreg))
743*bed243d3SAndroid Build Coastguard Worker #define __arm_rsrf64(sysreg) __builtin_bit_cast(double, __arm_rsr64(sysreg))
744*bed243d3SAndroid Build Coastguard Worker #define __arm_wsr(sysreg, v) __builtin_arm_wsr(sysreg, v)
745*bed243d3SAndroid Build Coastguard Worker #define __arm_wsr64(sysreg, v) __builtin_arm_wsr64(sysreg, v)
746*bed243d3SAndroid Build Coastguard Worker #define __arm_wsr128(sysreg, v) __builtin_arm_wsr128(sysreg, v)
747*bed243d3SAndroid Build Coastguard Worker #define __arm_wsrp(sysreg, v) __builtin_arm_wsrp(sysreg, v)
748*bed243d3SAndroid Build Coastguard Worker #define __arm_wsrf(sysreg, v) __arm_wsr(sysreg, __builtin_bit_cast(uint32_t, v))
749*bed243d3SAndroid Build Coastguard Worker #define __arm_wsrf64(sysreg, v) __arm_wsr64(sysreg, __builtin_bit_cast(uint64_t, v))
750*bed243d3SAndroid Build Coastguard Worker
751*bed243d3SAndroid Build Coastguard Worker /* 10.3 MTE intrinsics */
752*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE
753*bed243d3SAndroid Build Coastguard Worker #define __arm_mte_create_random_tag(__ptr, __mask) __builtin_arm_irg(__ptr, __mask)
754*bed243d3SAndroid Build Coastguard Worker #define __arm_mte_increment_tag(__ptr, __tag_offset) __builtin_arm_addg(__ptr, __tag_offset)
755*bed243d3SAndroid Build Coastguard Worker #define __arm_mte_exclude_tag(__ptr, __excluded) __builtin_arm_gmi(__ptr, __excluded)
756*bed243d3SAndroid Build Coastguard Worker #define __arm_mte_get_tag(__ptr) __builtin_arm_ldg(__ptr)
757*bed243d3SAndroid Build Coastguard Worker #define __arm_mte_set_tag(__ptr) __builtin_arm_stg(__ptr)
758*bed243d3SAndroid Build Coastguard Worker #define __arm_mte_ptrdiff(__ptra, __ptrb) __builtin_arm_subp(__ptra, __ptrb)
759*bed243d3SAndroid Build Coastguard Worker
760*bed243d3SAndroid Build Coastguard Worker /* 18 memcpy family of operations intrinsics - MOPS */
761*bed243d3SAndroid Build Coastguard Worker #define __arm_mops_memset_tag(__tagged_address, __value, __size) \
762*bed243d3SAndroid Build Coastguard Worker __builtin_arm_mops_memset_tag(__tagged_address, __value, __size)
763*bed243d3SAndroid Build Coastguard Worker #endif
764*bed243d3SAndroid Build Coastguard Worker
765*bed243d3SAndroid Build Coastguard Worker /* 11.3 Coprocessor Intrinsics */
766*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_COPROC)
767*bed243d3SAndroid Build Coastguard Worker
768*bed243d3SAndroid Build Coastguard Worker #if (__ARM_FEATURE_COPROC & 0x1)
769*bed243d3SAndroid Build Coastguard Worker
770*bed243d3SAndroid Build Coastguard Worker #if (__ARM_ARCH < 8)
771*bed243d3SAndroid Build Coastguard Worker #define __arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2) \
772*bed243d3SAndroid Build Coastguard Worker __builtin_arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2)
773*bed243d3SAndroid Build Coastguard Worker #endif /* __ARM_ARCH < 8 */
774*bed243d3SAndroid Build Coastguard Worker
775*bed243d3SAndroid Build Coastguard Worker #define __arm_ldc(coproc, CRd, p) __builtin_arm_ldc(coproc, CRd, p)
776*bed243d3SAndroid Build Coastguard Worker #define __arm_stc(coproc, CRd, p) __builtin_arm_stc(coproc, CRd, p)
777*bed243d3SAndroid Build Coastguard Worker
778*bed243d3SAndroid Build Coastguard Worker #define __arm_mcr(coproc, opc1, value, CRn, CRm, opc2) \
779*bed243d3SAndroid Build Coastguard Worker __builtin_arm_mcr(coproc, opc1, value, CRn, CRm, opc2)
780*bed243d3SAndroid Build Coastguard Worker #define __arm_mrc(coproc, opc1, CRn, CRm, opc2) \
781*bed243d3SAndroid Build Coastguard Worker __builtin_arm_mrc(coproc, opc1, CRn, CRm, opc2)
782*bed243d3SAndroid Build Coastguard Worker
783*bed243d3SAndroid Build Coastguard Worker #if (__ARM_ARCH != 4) && (__ARM_ARCH < 8)
784*bed243d3SAndroid Build Coastguard Worker #define __arm_ldcl(coproc, CRd, p) __builtin_arm_ldcl(coproc, CRd, p)
785*bed243d3SAndroid Build Coastguard Worker #define __arm_stcl(coproc, CRd, p) __builtin_arm_stcl(coproc, CRd, p)
786*bed243d3SAndroid Build Coastguard Worker #endif /* (__ARM_ARCH != 4) && (__ARM_ARCH != 8) */
787*bed243d3SAndroid Build Coastguard Worker
788*bed243d3SAndroid Build Coastguard Worker #if (__ARM_ARCH_8M_MAIN__) || (__ARM_ARCH_8_1M_MAIN__)
789*bed243d3SAndroid Build Coastguard Worker #define __arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2) \
790*bed243d3SAndroid Build Coastguard Worker __builtin_arm_cdp(coproc, opc1, CRd, CRn, CRm, opc2)
791*bed243d3SAndroid Build Coastguard Worker #define __arm_ldcl(coproc, CRd, p) __builtin_arm_ldcl(coproc, CRd, p)
792*bed243d3SAndroid Build Coastguard Worker #define __arm_stcl(coproc, CRd, p) __builtin_arm_stcl(coproc, CRd, p)
793*bed243d3SAndroid Build Coastguard Worker #endif /* ___ARM_ARCH_8M_MAIN__ */
794*bed243d3SAndroid Build Coastguard Worker
795*bed243d3SAndroid Build Coastguard Worker #endif /* __ARM_FEATURE_COPROC & 0x1 */
796*bed243d3SAndroid Build Coastguard Worker
797*bed243d3SAndroid Build Coastguard Worker #if (__ARM_FEATURE_COPROC & 0x2)
798*bed243d3SAndroid Build Coastguard Worker #define __arm_cdp2(coproc, opc1, CRd, CRn, CRm, opc2) \
799*bed243d3SAndroid Build Coastguard Worker __builtin_arm_cdp2(coproc, opc1, CRd, CRn, CRm, opc2)
800*bed243d3SAndroid Build Coastguard Worker #define __arm_ldc2(coproc, CRd, p) __builtin_arm_ldc2(coproc, CRd, p)
801*bed243d3SAndroid Build Coastguard Worker #define __arm_stc2(coproc, CRd, p) __builtin_arm_stc2(coproc, CRd, p)
802*bed243d3SAndroid Build Coastguard Worker #define __arm_ldc2l(coproc, CRd, p) __builtin_arm_ldc2l(coproc, CRd, p)
803*bed243d3SAndroid Build Coastguard Worker #define __arm_stc2l(coproc, CRd, p) __builtin_arm_stc2l(coproc, CRd, p)
804*bed243d3SAndroid Build Coastguard Worker #define __arm_mcr2(coproc, opc1, value, CRn, CRm, opc2) \
805*bed243d3SAndroid Build Coastguard Worker __builtin_arm_mcr2(coproc, opc1, value, CRn, CRm, opc2)
806*bed243d3SAndroid Build Coastguard Worker #define __arm_mrc2(coproc, opc1, CRn, CRm, opc2) \
807*bed243d3SAndroid Build Coastguard Worker __builtin_arm_mrc2(coproc, opc1, CRn, CRm, opc2)
808*bed243d3SAndroid Build Coastguard Worker #endif
809*bed243d3SAndroid Build Coastguard Worker
810*bed243d3SAndroid Build Coastguard Worker #if (__ARM_FEATURE_COPROC & 0x4)
811*bed243d3SAndroid Build Coastguard Worker #define __arm_mcrr(coproc, opc1, value, CRm) \
812*bed243d3SAndroid Build Coastguard Worker __builtin_arm_mcrr(coproc, opc1, value, CRm)
813*bed243d3SAndroid Build Coastguard Worker #define __arm_mrrc(coproc, opc1, CRm) __builtin_arm_mrrc(coproc, opc1, CRm)
814*bed243d3SAndroid Build Coastguard Worker #endif
815*bed243d3SAndroid Build Coastguard Worker
816*bed243d3SAndroid Build Coastguard Worker #if (__ARM_FEATURE_COPROC & 0x8)
817*bed243d3SAndroid Build Coastguard Worker #define __arm_mcrr2(coproc, opc1, value, CRm) \
818*bed243d3SAndroid Build Coastguard Worker __builtin_arm_mcrr2(coproc, opc1, value, CRm)
819*bed243d3SAndroid Build Coastguard Worker #define __arm_mrrc2(coproc, opc1, CRm) __builtin_arm_mrrc2(coproc, opc1, CRm)
820*bed243d3SAndroid Build Coastguard Worker #endif
821*bed243d3SAndroid Build Coastguard Worker
822*bed243d3SAndroid Build Coastguard Worker #endif // __ARM_FEATURE_COPROC
823*bed243d3SAndroid Build Coastguard Worker
824*bed243d3SAndroid Build Coastguard Worker /* 17 Transactional Memory Extension (TME) Intrinsics */
825*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_FEATURE_TME) && __ARM_FEATURE_TME
826*bed243d3SAndroid Build Coastguard Worker
827*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_REASON 0x00007fffu
828*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_RTRY 0x00008000u
829*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_CNCL 0x00010000u
830*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_MEM 0x00020000u
831*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_IMP 0x00040000u
832*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_ERR 0x00080000u
833*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_SIZE 0x00100000u
834*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_NEST 0x00200000u
835*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_DBG 0x00400000u
836*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_INT 0x00800000u
837*bed243d3SAndroid Build Coastguard Worker #define _TMFAILURE_TRIVIAL 0x01000000u
838*bed243d3SAndroid Build Coastguard Worker
839*bed243d3SAndroid Build Coastguard Worker #define __tstart() __builtin_arm_tstart()
840*bed243d3SAndroid Build Coastguard Worker #define __tcommit() __builtin_arm_tcommit()
841*bed243d3SAndroid Build Coastguard Worker #define __tcancel(__arg) __builtin_arm_tcancel(__arg)
842*bed243d3SAndroid Build Coastguard Worker #define __ttest() __builtin_arm_ttest()
843*bed243d3SAndroid Build Coastguard Worker
844*bed243d3SAndroid Build Coastguard Worker #endif /* __ARM_FEATURE_TME */
845*bed243d3SAndroid Build Coastguard Worker
846*bed243d3SAndroid Build Coastguard Worker /* 8.7 Armv8.5-A Random number generation intrinsics */
847*bed243d3SAndroid Build Coastguard Worker #if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE
848*bed243d3SAndroid Build Coastguard Worker static __inline__ int __attribute__((__always_inline__, __nodebug__, target("rand")))
__rndr(uint64_t * __p)849*bed243d3SAndroid Build Coastguard Worker __rndr(uint64_t *__p) {
850*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rndr(__p);
851*bed243d3SAndroid Build Coastguard Worker }
852*bed243d3SAndroid Build Coastguard Worker static __inline__ int __attribute__((__always_inline__, __nodebug__, target("rand")))
__rndrrs(uint64_t * __p)853*bed243d3SAndroid Build Coastguard Worker __rndrrs(uint64_t *__p) {
854*bed243d3SAndroid Build Coastguard Worker return __builtin_arm_rndrrs(__p);
855*bed243d3SAndroid Build Coastguard Worker }
856*bed243d3SAndroid Build Coastguard Worker #endif
857*bed243d3SAndroid Build Coastguard Worker
858*bed243d3SAndroid Build Coastguard Worker #if defined(__cplusplus)
859*bed243d3SAndroid Build Coastguard Worker }
860*bed243d3SAndroid Build Coastguard Worker #endif
861*bed243d3SAndroid Build Coastguard Worker
862*bed243d3SAndroid Build Coastguard Worker #endif /* __ARM_ACLE_H */
863