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