arm_acle.h revision 274958
1274958Sdim/*===---- arm_acle.h - ARM Non-Neon intrinsics -----------------------------===
2274958Sdim *
3274958Sdim * Permission is hereby granted, free of charge, to any person obtaining a copy
4274958Sdim * of this software and associated documentation files (the "Software"), to deal
5274958Sdim * in the Software without restriction, including without limitation the rights
6274958Sdim * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7274958Sdim * copies of the Software, and to permit persons to whom the Software is
8274958Sdim * furnished to do so, subject to the following conditions:
9274958Sdim *
10274958Sdim * The above copyright notice and this permission notice shall be included in
11274958Sdim * all copies or substantial portions of the Software.
12274958Sdim *
13274958Sdim * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14274958Sdim * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15274958Sdim * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16274958Sdim * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17274958Sdim * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18274958Sdim * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19274958Sdim * THE SOFTWARE.
20274958Sdim *
21274958Sdim *===-----------------------------------------------------------------------===
22274958Sdim */
23274958Sdim
24274958Sdim#ifndef __ARM_ACLE_H
25274958Sdim#define __ARM_ACLE_H
26274958Sdim
27274958Sdim#ifndef __ARM_ACLE
28274958Sdim#error "ACLE intrinsics support not enabled."
29274958Sdim#endif
30274958Sdim
31274958Sdim#include <stdint.h>
32274958Sdim
33274958Sdim#if defined(__cplusplus)
34274958Sdimextern "C" {
35274958Sdim#endif
36274958Sdim
37274958Sdim/* 8 SYNCHRONIZATION, BARRIER AND HINT INTRINSICS */
38274958Sdim/* 8.3 Memory barriers */
39274958Sdim#if !defined(_MSC_VER)
40274958Sdim#define __dmb(i) __builtin_arm_dmb(i)
41274958Sdim#define __dsb(i) __builtin_arm_dsb(i)
42274958Sdim#define __isb(i) __builtin_arm_isb(i)
43274958Sdim#endif
44274958Sdim
45274958Sdim/* 8.4 Hints */
46274958Sdim
47274958Sdim#if !defined(_MSC_VER)
48274958Sdimstatic __inline__ void __attribute__((always_inline, nodebug)) __wfi(void) {
49274958Sdim  __builtin_arm_wfi();
50274958Sdim}
51274958Sdim
52274958Sdimstatic __inline__ void __attribute__((always_inline, nodebug)) __wfe(void) {
53274958Sdim  __builtin_arm_wfe();
54274958Sdim}
55274958Sdim
56274958Sdimstatic __inline__ void __attribute__((always_inline, nodebug)) __sev(void) {
57274958Sdim  __builtin_arm_sev();
58274958Sdim}
59274958Sdim
60274958Sdimstatic __inline__ void __attribute__((always_inline, nodebug)) __sevl(void) {
61274958Sdim  __builtin_arm_sevl();
62274958Sdim}
63274958Sdim
64274958Sdimstatic __inline__ void __attribute__((always_inline, nodebug)) __yield(void) {
65274958Sdim  __builtin_arm_yield();
66274958Sdim}
67274958Sdim#endif
68274958Sdim
69274958Sdim/* 8.7 NOP */
70274958Sdimstatic __inline__ void __attribute__((always_inline, nodebug)) __nop(void) {
71274958Sdim  __builtin_arm_nop();
72274958Sdim}
73274958Sdim
74274958Sdim/* 9 DATA-PROCESSING INTRINSICS */
75274958Sdim/* 9.2 Miscellaneous data-processing intrinsics */
76274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
77274958Sdim  __clz(uint32_t t) {
78274958Sdim  return __builtin_clz(t);
79274958Sdim}
80274958Sdim
81274958Sdimstatic __inline__ unsigned long __attribute__((always_inline, nodebug))
82274958Sdim  __clzl(unsigned long t) {
83274958Sdim  return __builtin_clzl(t);
84274958Sdim}
85274958Sdim
86274958Sdimstatic __inline__ uint64_t __attribute__((always_inline, nodebug))
87274958Sdim  __clzll(uint64_t t) {
88274958Sdim#if __SIZEOF_LONG_LONG__ == 8
89274958Sdim  return __builtin_clzll(t);
90274958Sdim#else
91274958Sdim  return __builtin_clzl(t);
92274958Sdim#endif
93274958Sdim}
94274958Sdim
95274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
96274958Sdim  __rev(uint32_t t) {
97274958Sdim  return __builtin_bswap32(t);
98274958Sdim}
99274958Sdim
100274958Sdimstatic __inline__ unsigned long __attribute__((always_inline, nodebug))
101274958Sdim  __revl(unsigned long t) {
102274958Sdim#if __SIZEOF_LONG__ == 4
103274958Sdim  return __builtin_bswap32(t);
104274958Sdim#else
105274958Sdim  return __builtin_bswap64(t);
106274958Sdim#endif
107274958Sdim}
108274958Sdim
109274958Sdimstatic __inline__ uint64_t __attribute__((always_inline, nodebug))
110274958Sdim  __revll(uint64_t t) {
111274958Sdim  return __builtin_bswap64(t);
112274958Sdim}
113274958Sdim
114274958Sdim/*
115274958Sdim * 9.4 Saturating intrinsics
116274958Sdim *
117274958Sdim * FIXME: Change guard to their corrosponding __ARM_FEATURE flag when Q flag
118274958Sdim * intrinsics are implemented and the flag is enabled.
119274958Sdim */
120274958Sdim/* 9.4.1 Width-specified saturation intrinsics */
121274958Sdim#if __ARM_32BIT_STATE
122274958Sdim#define __ssat(x, y) __builtin_arm_ssat(x, y)
123274958Sdim#define __usat(x, y) __builtin_arm_usat(x, y)
124274958Sdim#endif
125274958Sdim
126274958Sdim/* 9.4.2 Saturating addition and subtraction intrinsics */
127274958Sdim#if __ARM_32BIT_STATE
128274958Sdimstatic __inline__ int32_t __attribute__((always_inline, nodebug))
129274958Sdim  __qadd(int32_t t, int32_t v) {
130274958Sdim  return __builtin_arm_qadd(t, v);
131274958Sdim}
132274958Sdim
133274958Sdimstatic __inline__ int32_t __attribute__((always_inline, nodebug))
134274958Sdim  __qsub(int32_t t, int32_t v) {
135274958Sdim  return __builtin_arm_qsub(t, v);
136274958Sdim}
137274958Sdim
138274958Sdimstatic __inline__ int32_t __attribute__((always_inline, nodebug))
139274958Sdim__qdbl(int32_t t) {
140274958Sdim  return __builtin_arm_qadd(t, t);
141274958Sdim}
142274958Sdim#endif
143274958Sdim
144274958Sdim/* 9.7 CRC32 intrinsics */
145274958Sdim#if __ARM_FEATURE_CRC32
146274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
147274958Sdim  __crc32b(uint32_t a, uint8_t b) {
148274958Sdim  return __builtin_arm_crc32b(a, b);
149274958Sdim}
150274958Sdim
151274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
152274958Sdim  __crc32h(uint32_t a, uint16_t b) {
153274958Sdim  return __builtin_arm_crc32h(a, b);
154274958Sdim}
155274958Sdim
156274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
157274958Sdim  __crc32w(uint32_t a, uint32_t b) {
158274958Sdim  return __builtin_arm_crc32w(a, b);
159274958Sdim}
160274958Sdim
161274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
162274958Sdim  __crc32d(uint32_t a, uint64_t b) {
163274958Sdim  return __builtin_arm_crc32d(a, b);
164274958Sdim}
165274958Sdim
166274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
167274958Sdim  __crc32cb(uint32_t a, uint8_t b) {
168274958Sdim  return __builtin_arm_crc32cb(a, b);
169274958Sdim}
170274958Sdim
171274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
172274958Sdim  __crc32ch(uint32_t a, uint16_t b) {
173274958Sdim  return __builtin_arm_crc32ch(a, b);
174274958Sdim}
175274958Sdim
176274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
177274958Sdim  __crc32cw(uint32_t a, uint32_t b) {
178274958Sdim  return __builtin_arm_crc32cw(a, b);
179274958Sdim}
180274958Sdim
181274958Sdimstatic __inline__ uint32_t __attribute__((always_inline, nodebug))
182274958Sdim  __crc32cd(uint32_t a, uint64_t b) {
183274958Sdim  return __builtin_arm_crc32cd(a, b);
184274958Sdim}
185274958Sdim#endif
186274958Sdim
187274958Sdim#if defined(__cplusplus)
188274958Sdim}
189274958Sdim#endif
190274958Sdim
191274958Sdim#endif /* __ARM_ACLE_H */
192