/** * 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)) #include #define compiler_debug_print(message) while (*message++) { write(STDOUT_FILENO, (message), 1); } #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) noexcept { 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) noexcept { 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) noexcept { 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) noexcept { if (!mask) { return -1; } #if __LITTLE_ENDIAN__ return __builtin_ctz(mask); #else return 31 - __builtin_clz(mask); #endif } /* #include static inline void cpuid(int32 cpuInfo[4], int32 function_id) { __cpuid(function_id, cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]); } */ inline void compiler_cpuid(int32 cpuInfo[4], int32 function_id) noexcept { asm volatile( "cpuid" : "=a" (cpuInfo[0]), "=b" (cpuInfo[1]), "=c" (cpuInfo[2]), "=d" (cpuInfo[3]) : "a" (function_id) ); } #endif