53#define OJPH_COMPILER_MSVC
54#elif (defined __GNUC__)
55#define OJPH_COMPILER_GNUC
59#define OJPH_EMSCRIPTEN
62#ifdef OJPH_COMPILER_MSVC
69#if defined(__arm__) || defined(__TARGET_ARCH_ARM) \
70 || defined(__aarch64__) || defined(_M_ARM64)
72#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
73 #define OJPH_ARCH_I386
74#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) \
76 #define OJPH_ARCH_X86_64
77#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
78 #define OJPH_ARCH_IA64
79#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \
80 || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \
81 || defined(_M_MPPC) || defined(_M_PPC)
82 #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
83 #define OJPH_ARCH_PPC64
88 #define OJPH_ARCH_UNKNOWN
95#if !defined(OJPH_ARCH_X86_64) && !defined(OJPH_ARCH_I386) && \
96 !defined(OJPH_ARCH_ARM) && !defined(OJPH_DISABLE_SIMD)
97#define OJPH_DISABLE_SIMD
103#if (defined WIN32) || (defined _WIN32) || (defined _WIN64)
104#define OJPH_OS_WINDOWS
105#elif (defined __APPLE__)
107#elif (defined __ANDROID__)
108#define OJPH_OS_ANDROID
109#elif (defined __linux)
116#if defined(OJPH_OS_WINDOWS) && defined(OJPH_BUILD_SHARED_LIBRARY)
117#define OJPH_EXPORT __declspec(dllexport)
154 #if defined(OJPH_COMPILER_MSVC) \
155 && (defined(OJPH_ARCH_X86_64) || defined(OJPH_ARCH_I386))
156 return (
ui32)__popcnt(val);
157 #elif (defined OJPH_COMPILER_GNUC)
158 return (
ui32)__builtin_popcount(val);
160 val -= ((val >> 1) & 0x55555555);
161 val = (((val >> 2) & 0x33333333) + (val & 0x33333333));
162 val = (((val >> 4) + val) & 0x0f0f0f0f);
165 return (
int)(val & 0x0000003f);
172 #if defined(OJPH_COMPILER_MSVC) \
173 && (defined(OJPH_ARCH_X86_64) || defined(OJPH_ARCH_I386))
174 return (
ui32)__popcnt64(val);
175 #elif (defined OJPH_COMPILER_GNUC)
176 return (
ui32)__builtin_popcountll(val);
178 const ui64 k1 = 0x5555555555555555ull;
179 const ui64 k2 = 0x3333333333333333ull;
180 const ui64 k4 = 0x0F0F0F0F0F0F0F0Full;
181 const ui64 kf = 0x0101010101010101ull;
184 val = val - ((val >> 1) & k1);
186 val = (val & k2) + ((val >> 2) & k2);
188 val = (val + (val >> 4)) & k4 ;
190 val = (val * kf) >> 56;
196#ifdef OJPH_COMPILER_MSVC
197 #pragma intrinsic(_BitScanReverse)
201 #ifdef OJPH_COMPILER_MSVC
202 unsigned long result = 0;
203 _BitScanReverse(&result, val);
204 return 31 ^ (
ui32)result;
205 #elif (defined OJPH_COMPILER_GNUC)
206 return (
ui32)__builtin_clz(val);
218#ifdef OJPH_COMPILER_MSVC
219 #pragma intrinsic(_BitScanReverse64)
223 #ifdef OJPH_COMPILER_MSVC
224 unsigned long result = 0;
225 _BitScanReverse64(&result, val);
226 return 63 ^ (
ui32)result;
227 #elif (defined OJPH_COMPILER_GNUC)
228 return (
ui32)__builtin_clzll(val);
241#ifdef OJPH_COMPILER_MSVC
242 #pragma intrinsic(_BitScanForward)
246 #ifdef OJPH_COMPILER_MSVC
247 unsigned long result = 0;
248 _BitScanForward(&result, val);
250 #elif (defined OJPH_COMPILER_GNUC)
251 return (
ui32)__builtin_ctz(val);
265 #ifdef OJPH_COMPILER_MSVC
266 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
267 #elif (defined OJPH_COMPILER_GNUC)
268 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
270 return (
si32)round(val);
277 #ifdef OJPH_COMPILER_MSVC
279 #elif (defined OJPH_COMPILER_GNUC)
282 return (
si32)trunc(val);
289 #ifndef OJPH_EMSCRIPTEN
305 template <
typename T, ui32 N>
315 template <
typename T, ui32 N>
317 intptr_t p =
reinterpret_cast<intptr_t
>(ptr);
320 return reinterpret_cast<T *
>(p);
@ ARM_CPU_EXT_LEVEL_GENERIC
@ ARM_CPU_EXT_LEVEL_ASIMD
const ui32 object_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
const ui32 byte_alignment
static si32 ojph_round(float val)
size_t calc_aligned_size(size_t size)
static ui32 population_count64(ui64 val)
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