54#define OJPH_COMPILER_MSVC
55#elif (defined __GNUC__)
56#define OJPH_COMPILER_GNUC
60#define OJPH_EMSCRIPTEN
63#ifdef OJPH_COMPILER_MSVC
70#ifdef OJPH_COMPILER_MSVC
71 #define OJPH_FORCE_INLINE static __forceinline
72 #define OJPH_NO_INLINE static __declspec(noinline)
74 #define OJPH_FORCE_INLINE static inline __attribute__((always_inline))
75 #define OJPH_NO_INLINE static __attribute__((noinline))
81#if defined(__arm__) || defined(__TARGET_ARCH_ARM) \
82 || defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
84#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
85 #define OJPH_ARCH_I386
86#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) \
88 #define OJPH_ARCH_X86_64
89#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
90 #define OJPH_ARCH_IA64
91#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \
92 || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \
93 || defined(_M_MPPC) || defined(_M_PPC)
94 #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
95 #define OJPH_ARCH_PPC64
100 #define OJPH_ARCH_UNKNOWN
107#if !defined(OJPH_ARCH_X86_64) && !defined(OJPH_ARCH_I386) && \
108 !defined(OJPH_ARCH_ARM) && !defined(OJPH_DISABLE_SIMD)
109#define OJPH_DISABLE_SIMD
115#if (defined WIN32) || (defined _WIN32) || (defined _WIN64)
116#define OJPH_OS_WINDOWS
117#elif (defined __APPLE__)
119#elif (defined __ANDROID__)
120#define OJPH_OS_ANDROID
121#elif (defined __linux)
123#elif (defined __FreeBSD__)
124#define OJPH_OS_FREEBSD
125#elif (defined __OpenBSD__)
126#define OJPH_OS_OPENBSD
132#if defined(OJPH_OS_WINDOWS) && defined(OJPH_BUILD_SHARED_LIBRARY)
133#define OJPH_EXPORT __declspec(dllexport)
170 #if defined(OJPH_COMPILER_MSVC) \
171 && (defined(OJPH_ARCH_X86_64) || defined(OJPH_ARCH_I386))
172 return (
ui32)__popcnt(val);
173 #elif (defined OJPH_COMPILER_GNUC)
174 return (
ui32)__builtin_popcount(val);
176 val -= ((val >> 1) & 0x55555555);
177 val = (((val >> 2) & 0x33333333) + (val & 0x33333333));
178 val = (((val >> 4) + val) & 0x0f0f0f0f);
181 return (
int)(val & 0x0000003f);
186#ifdef OJPH_COMPILER_MSVC
187 #pragma intrinsic(_BitScanReverse)
191 #ifdef OJPH_COMPILER_MSVC
192 unsigned long result = 0;
193 _BitScanReverse(&result, val);
194 return 31 ^ (
ui32)result;
195 #elif (defined OJPH_COMPILER_GNUC)
196 return (
ui32)__builtin_clz(val);
208#ifdef OJPH_COMPILER_MSVC
209 #if (defined OJPH_ARCH_X86_64 || defined OJPH_ARCH_ARM)
210 #pragma intrinsic(_BitScanReverse64)
211 #elif (defined OJPH_ARCH_I386)
212 #pragma intrinsic(_BitScanReverse)
214 #error Error unsupport MSVC version
219 #ifdef OJPH_COMPILER_MSVC
220 unsigned long result = 0;
221 #if (defined OJPH_ARCH_X86_64) || (defined OJPH_ARCH_ARM)
222 _BitScanReverse64(&result, val);
223 #elif (defined OJPH_ARCH_I386)
226 _BitScanReverse(&result, lsb);
228 _BitScanReverse(&result, msb);
232 #error Error unsupport MSVC version
234 return 63 ^ (
ui32)result;
235 #elif (defined OJPH_COMPILER_GNUC)
236 return (
ui32)__builtin_clzll(val);
244 return 64 - population_count64(val);
249#ifdef OJPH_COMPILER_MSVC
250 #pragma intrinsic(_BitScanForward)
254 #ifdef OJPH_COMPILER_MSVC
255 unsigned long result = 0;
256 _BitScanForward(&result, val);
258 #elif (defined OJPH_COMPILER_GNUC)
259 return (
ui32)__builtin_ctz(val);
271#ifdef OJPH_COMPILER_MSVC
272 #pragma intrinsic(_BitScanForward64)
276 #ifdef OJPH_COMPILER_MSVC
277 unsigned long result = 0;
278 #if (defined OJPH_ARCH_X86_64) || (defined OJPH_ARCH_ARM)
279 _BitScanForward64(&result, val);
280 #elif (defined OJPH_ARCH_I386)
283 _BitScanForward(&result, lsb);
285 _BitScanForward(&result, msb);
290 #elif (defined OJPH_COMPILER_GNUC)
291 return (
ui32)__builtin_ctzll(val);
302 #ifdef OJPH_COMPILER_MSVC
303 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
304 #elif (defined OJPH_COMPILER_GNUC)
305 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
307 return (
si32)round(val);
314 #ifdef OJPH_COMPILER_MSVC
316 #elif (defined OJPH_COMPILER_GNUC)
319 return (
si32)trunc(val);
326 #ifndef OJPH_EMSCRIPTEN
342 template <
typename T, ui32 N>
352 template <
typename T, ui32 N>
354 intptr_t p =
reinterpret_cast<intptr_t
>(ptr);
357 return reinterpret_cast<T *
>(p);
const ui32 object_alignment
@ ARM_CPU_EXT_LEVEL_GENERIC
@ ARM_CPU_EXT_LEVEL_ASIMD
const ui32 byte_alignment
static si32 ojph_round(float val)
size_t calc_aligned_size(size_t size)
static ui32 population_count(ui32 val)
OJPH_EXPORT int get_cpu_ext_level()
static si32 ojph_trunc(float val)
static ui32 count_trailing_zeros(ui32 val)
static ui32 count_leading_zeros(ui32 val)
const ui32 log_byte_alignment
@ X86_CPU_EXT_LEVEL_AVX512
@ X86_CPU_EXT_LEVEL_GENERIC
@ X86_CPU_EXT_LEVEL_SSE41
@ X86_CPU_EXT_LEVEL_SSE42
@ X86_CPU_EXT_LEVEL_SSSE3
@ X86_CPU_EXT_LEVEL_AVX2FMA