cOMS/compiler/gcc/CompilerUtils.h

84 lines
1.9 KiB
C

/**
* Jingga
*
* @copyright Jingga
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
#ifndef TOS_COMPILER_GCC_COMPILER_UTILS_H
#define TOS_COMPILER_GCC_COMPILER_UTILS_H
#include "../../utils/TestUtils.h"
#define PACKED_STRUCT __attribute__((__packed__))
#define UNPACKED_STRUCT ((void) 0)
#define EXPORT_LIB extern "C" __attribute__((visibility("default")))
#if DEBUG
#define UNREACHABLE() ASSERT_SIMPLE(false)
#else
#define UNREACHABLE() __builtin_unreachable()
#endif
#define FORCE_INLINE __attribute__((always_inline))
#define compiler_popcount_32(data) __builtin_popcount((data))
#define compiler_popcount_64(data) __builtin_popcountl((data))
#define __restrict __restrict__
#define compiler_prefetch(mem) __builtin_prefetch((mem), 0, 3)
#define compiler_prefetch_l1(mem) __builtin_prefetch((mem), 0, 3)
#define compiler_prefetch_l2(mem) __builtin_prefetch((mem), 0, 2)
#define compiler_prefetch_l3(mem) __builtin_prefetch((mem), 0, 1)
int32 compiler_find_first_bit_r2l(uint64 mask) {
if (!mask) {
return -1;
}
#if __LITTLE_ENDIAN__
return return 63 - __builtin_clzll(mask);
#else
return __builtin_ctzll(mask);
#endif
}
int32 compiler_find_first_bit_r2l(uint32 mask) {
if (!mask) {
return -1;
}
#if __LITTLE_ENDIAN__
return __builtin_ctz(mask);
#else
return 31 - __builtin_clz(mask);
#endif
}
int32 compiler_find_first_bit_l2r(uint64 mask) {
if (!mask) {
return -1;
}
#if __LITTLE_ENDIAN__
return return 63 - __builtin_clzll(mask);
#else
return __builtin_ctzll(mask);
#endif
}
int32 compiler_find_first_bit_l2r(uint32 mask) {
if (!mask) {
return -1;
}
#if __LITTLE_ENDIAN__
return __builtin_ctz(mask);
#else
return 31 - __builtin_clz(mask);
#endif
}
#endif