Path: blob/master/tools/android-sdk/renderscript/clang-include/arm_acle.h
496 views
/*===---- arm_acle.h - ARM Non-Neon intrinsics -----------------------------===1*2* Permission is hereby granted, free of charge, to any person obtaining a copy3* of this software and associated documentation files (the "Software"), to deal4* in the Software without restriction, including without limitation the rights5* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell6* copies of the Software, and to permit persons to whom the Software is7* furnished to do so, subject to the following conditions:8*9* The above copyright notice and this permission notice shall be included in10* all copies or substantial portions of the Software.11*12* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR13* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,14* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE15* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER16* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,17* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN18* THE SOFTWARE.19*20*===-----------------------------------------------------------------------===21*/2223#ifndef __ARM_ACLE_H24#define __ARM_ACLE_H2526#ifndef __ARM_ACLE27#error "ACLE intrinsics support not enabled."28#endif2930#include <stdint.h>3132#if defined(__cplusplus)33extern "C" {34#endif3536/* 8 SYNCHRONIZATION, BARRIER AND HINT INTRINSICS */37/* 8.3 Memory barriers */38#if !defined(_MSC_VER)39#define __dmb(i) __builtin_arm_dmb(i)40#define __dsb(i) __builtin_arm_dsb(i)41#define __isb(i) __builtin_arm_isb(i)42#endif4344/* 8.4 Hints */4546#if !defined(_MSC_VER)47static __inline__ void __attribute__((__always_inline__, __nodebug__)) __wfi(void) {48__builtin_arm_wfi();49}5051static __inline__ void __attribute__((__always_inline__, __nodebug__)) __wfe(void) {52__builtin_arm_wfe();53}5455static __inline__ void __attribute__((__always_inline__, __nodebug__)) __sev(void) {56__builtin_arm_sev();57}5859static __inline__ void __attribute__((__always_inline__, __nodebug__)) __sevl(void) {60__builtin_arm_sevl();61}6263static __inline__ void __attribute__((__always_inline__, __nodebug__)) __yield(void) {64__builtin_arm_yield();65}66#endif6768#if __ARM_32BIT_STATE69#define __dbg(t) __builtin_arm_dbg(t)70#endif7172/* 8.5 Swap */73static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))74__swp(uint32_t __x, volatile uint32_t *__p) {75uint32_t v;76do77v = __builtin_arm_ldrex(__p);78while (__builtin_arm_strex(__x, __p));79return v;80}8182/* 8.6 Memory prefetch intrinsics */83/* 8.6.1 Data prefetch */84#define __pld(addr) __pldx(0, 0, 0, addr)8586#if __ARM_32BIT_STATE87#define __pldx(access_kind, cache_level, retention_policy, addr) \88__builtin_arm_prefetch(addr, access_kind, 1)89#else90#define __pldx(access_kind, cache_level, retention_policy, addr) \91__builtin_arm_prefetch(addr, access_kind, cache_level, retention_policy, 1)92#endif9394/* 8.6.2 Instruction prefetch */95#define __pli(addr) __plix(0, 0, addr)9697#if __ARM_32BIT_STATE98#define __plix(cache_level, retention_policy, addr) \99__builtin_arm_prefetch(addr, 0, 0)100#else101#define __plix(cache_level, retention_policy, addr) \102__builtin_arm_prefetch(addr, 0, cache_level, retention_policy, 0)103#endif104105/* 8.7 NOP */106static __inline__ void __attribute__((__always_inline__, __nodebug__)) __nop(void) {107__builtin_arm_nop();108}109110/* 9 DATA-PROCESSING INTRINSICS */111/* 9.2 Miscellaneous data-processing intrinsics */112/* ROR */113static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))114__ror(uint32_t __x, uint32_t __y) {115__y %= 32;116if (__y == 0)117return __x;118return (__x >> __y) | (__x << (32 - __y));119}120121static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))122__rorll(uint64_t __x, uint32_t __y) {123__y %= 64;124if (__y == 0)125return __x;126return (__x >> __y) | (__x << (64 - __y));127}128129static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))130__rorl(unsigned long __x, uint32_t __y) {131#if __SIZEOF_LONG__ == 4132return __ror(__x, __y);133#else134return __rorll(__x, __y);135#endif136}137138139/* CLZ */140static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))141__clz(uint32_t __t) {142return __builtin_clz(__t);143}144145static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))146__clzl(unsigned long __t) {147return __builtin_clzl(__t);148}149150static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))151__clzll(uint64_t __t) {152return __builtin_clzll(__t);153}154155/* REV */156static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))157__rev(uint32_t __t) {158return __builtin_bswap32(__t);159}160161static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))162__revl(unsigned long __t) {163#if __SIZEOF_LONG__ == 4164return __builtin_bswap32(__t);165#else166return __builtin_bswap64(__t);167#endif168}169170static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))171__revll(uint64_t __t) {172return __builtin_bswap64(__t);173}174175/* REV16 */176static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))177__rev16(uint32_t __t) {178return __ror(__rev(__t), 16);179}180181static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))182__rev16ll(uint64_t __t) {183return (((uint64_t)__rev16(__t >> 32)) << 32) | __rev16(__t);184}185186static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))187__rev16l(unsigned long __t) {188#if __SIZEOF_LONG__ == 4189return __rev16(__t);190#else191return __rev16ll(__t);192#endif193}194195/* REVSH */196static __inline__ int16_t __attribute__((__always_inline__, __nodebug__))197__revsh(int16_t __t) {198return __builtin_bswap16(__t);199}200201/* RBIT */202static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))203__rbit(uint32_t __t) {204return __builtin_arm_rbit(__t);205}206207static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))208__rbitll(uint64_t __t) {209#if __ARM_32BIT_STATE210return (((uint64_t)__builtin_arm_rbit(__t)) << 32) |211__builtin_arm_rbit(__t >> 32);212#else213return __builtin_arm_rbit64(__t);214#endif215}216217static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))218__rbitl(unsigned long __t) {219#if __SIZEOF_LONG__ == 4220return __rbit(__t);221#else222return __rbitll(__t);223#endif224}225226/*227* 9.4 Saturating intrinsics228*229* FIXME: Change guard to their corrosponding __ARM_FEATURE flag when Q flag230* intrinsics are implemented and the flag is enabled.231*/232/* 9.4.1 Width-specified saturation intrinsics */233#if __ARM_32BIT_STATE234#define __ssat(x, y) __builtin_arm_ssat(x, y)235#define __usat(x, y) __builtin_arm_usat(x, y)236#endif237238/* 9.4.2 Saturating addition and subtraction intrinsics */239#if __ARM_32BIT_STATE240static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))241__qadd(int32_t __t, int32_t __v) {242return __builtin_arm_qadd(__t, __v);243}244245static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))246__qsub(int32_t __t, int32_t __v) {247return __builtin_arm_qsub(__t, __v);248}249250static __inline__ int32_t __attribute__((__always_inline__, __nodebug__))251__qdbl(int32_t __t) {252return __builtin_arm_qadd(__t, __t);253}254#endif255256/* 9.7 CRC32 intrinsics */257#if __ARM_FEATURE_CRC32258static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))259__crc32b(uint32_t __a, uint8_t __b) {260return __builtin_arm_crc32b(__a, __b);261}262263static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))264__crc32h(uint32_t __a, uint16_t __b) {265return __builtin_arm_crc32h(__a, __b);266}267268static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))269__crc32w(uint32_t __a, uint32_t __b) {270return __builtin_arm_crc32w(__a, __b);271}272273static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))274__crc32d(uint32_t __a, uint64_t __b) {275return __builtin_arm_crc32d(__a, __b);276}277278static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))279__crc32cb(uint32_t __a, uint8_t __b) {280return __builtin_arm_crc32cb(__a, __b);281}282283static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))284__crc32ch(uint32_t __a, uint16_t __b) {285return __builtin_arm_crc32ch(__a, __b);286}287288static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))289__crc32cw(uint32_t __a, uint32_t __b) {290return __builtin_arm_crc32cw(__a, __b);291}292293static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))294__crc32cd(uint32_t __a, uint64_t __b) {295return __builtin_arm_crc32cd(__a, __b);296}297#endif298299/* 10.1 Special register intrinsics */300#define __arm_rsr(sysreg) __builtin_arm_rsr(sysreg)301#define __arm_rsr64(sysreg) __builtin_arm_rsr64(sysreg)302#define __arm_rsrp(sysreg) __builtin_arm_rsrp(sysreg)303#define __arm_wsr(sysreg, v) __builtin_arm_wsr(sysreg, v)304#define __arm_wsr64(sysreg, v) __builtin_arm_wsr64(sysreg, v)305#define __arm_wsrp(sysreg, v) __builtin_arm_wsrp(sysreg, v)306307#if defined(__cplusplus)308}309#endif310311#endif /* __ARM_ACLE_H */312313314