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)
111#elif (defined __FreeBSD__)
112#define OJPH_OS_FREEBSD
113#elif (defined __OpenBSD__)
114#define OJPH_OS_OPENBSD
120#if defined(OJPH_OS_WINDOWS) && defined(OJPH_BUILD_SHARED_LIBRARY)
121#define OJPH_EXPORT __declspec(dllexport)
158 #if defined(OJPH_COMPILER_MSVC) \
159 && (defined(OJPH_ARCH_X86_64) || defined(OJPH_ARCH_I386))
160 return (
ui32)__popcnt(val);
161 #elif (defined OJPH_COMPILER_GNUC)
162 return (
ui32)__builtin_popcount(val);
164 val -= ((val >> 1) & 0x55555555);
165 val = (((val >> 2) & 0x33333333) + (val & 0x33333333));
166 val = (((val >> 4) + val) & 0x0f0f0f0f);
169 return (
int)(val & 0x0000003f);
174#ifdef OJPH_COMPILER_MSVC
175 #pragma intrinsic(_BitScanReverse)
179 #ifdef OJPH_COMPILER_MSVC
180 unsigned long result = 0;
181 _BitScanReverse(&result, val);
182 return 31 ^ (
ui32)result;
183 #elif (defined OJPH_COMPILER_GNUC)
184 return (
ui32)__builtin_clz(val);
196#ifdef OJPH_COMPILER_MSVC
197 #if (defined OJPH_ARCH_X86_64 || defined OJPH_ARCH_ARM)
198 #pragma intrinsic(_BitScanReverse64)
199 #elif (defined OJPH_ARCH_I386)
200 #pragma intrinsic(_BitScanReverse)
202 #error Error unsupport MSVC version
207 #ifdef OJPH_COMPILER_MSVC
208 unsigned long result = 0;
209 #if (defined OJPH_ARCH_X86_64) || (defined OJPH_ARCH_ARM)
210 _BitScanReverse64(&result, val);
211 #elif (defined OJPH_ARCH_I386)
214 _BitScanReverse(&result, lsb);
216 _BitScanReverse(&result, msb);
220 #error Error unsupport MSVC version
222 return 63 ^ (
ui32)result;
223 #elif (defined OJPH_COMPILER_GNUC)
224 return (
ui32)__builtin_clzll(val);
232 return 64 - population_count64(val);
237#ifdef OJPH_COMPILER_MSVC
238 #pragma intrinsic(_BitScanForward)
242 #ifdef OJPH_COMPILER_MSVC
243 unsigned long result = 0;
244 _BitScanForward(&result, val);
246 #elif (defined OJPH_COMPILER_GNUC)
247 return (
ui32)__builtin_ctz(val);
261 #ifdef OJPH_COMPILER_MSVC
262 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
263 #elif (defined OJPH_COMPILER_GNUC)
264 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
266 return (
si32)round(val);
273 #ifdef OJPH_COMPILER_MSVC
275 #elif (defined OJPH_COMPILER_GNUC)
278 return (
si32)trunc(val);
285 #ifndef OJPH_EMSCRIPTEN
301 template <
typename T, ui32 N>
303 size = size *
sizeof(T) + N - 1;
311 template <
typename T, ui32 N>
313 intptr_t p =
reinterpret_cast<intptr_t
>(ptr);
316 return reinterpret_cast<T *
>(p);
Definition CoderOJPH.cpp:92
static si32 ojph_trunc(float val)
Definition ojph_arch.h:271
@ X86_CPU_EXT_LEVEL_GENERIC
Definition ojph_arch.h:133
@ X86_CPU_EXT_LEVEL_MMX
Definition ojph_arch.h:134
@ X86_CPU_EXT_LEVEL_SSE
Definition ojph_arch.h:135
@ X86_CPU_EXT_LEVEL_SSSE3
Definition ojph_arch.h:138
@ X86_CPU_EXT_LEVEL_AVX512
Definition ojph_arch.h:144
@ X86_CPU_EXT_LEVEL_AVX
Definition ojph_arch.h:141
@ X86_CPU_EXT_LEVEL_AVX2FMA
Definition ojph_arch.h:143
@ X86_CPU_EXT_LEVEL_SSE2
Definition ojph_arch.h:136
@ X86_CPU_EXT_LEVEL_AVX2
Definition ojph_arch.h:142
@ X86_CPU_EXT_LEVEL_SSE3
Definition ojph_arch.h:137
@ X86_CPU_EXT_LEVEL_SSE41
Definition ojph_arch.h:139
@ X86_CPU_EXT_LEVEL_SSE42
Definition ojph_arch.h:140
@ ARM_CPU_EXT_LEVEL_NEON
Definition ojph_arch.h:149
@ ARM_CPU_EXT_LEVEL_GENERIC
Definition ojph_arch.h:148
@ ARM_CPU_EXT_LEVEL_SVE
Definition ojph_arch.h:151
@ ARM_CPU_EXT_LEVEL_ASIMD
Definition ojph_arch.h:150
@ ARM_CPU_EXT_LEVEL_SVE2
Definition ojph_arch.h:152
uint64_t ui64
Definition ojph_defs.h:56
const ui32 object_alignment
Definition ojph_arch.h:288
T * align_ptr(T *ptr)
Definition ojph_arch.h:312
const ui32 byte_alignment
Definition ojph_arch.h:286
uint32_t ui32
Definition ojph_defs.h:54
static ui32 count_leading_zeros(ui32 val)
Definition ojph_arch.h:177
static ui32 population_count(ui32 val)
Definition ojph_arch.h:156
size_t calc_aligned_size(size_t size)
Definition ojph_arch.h:302
OJPH_EXPORT int get_cpu_ext_level()
Definition ojph_arch.cpp:256
static si32 ojph_round(float val)
Definition ojph_arch.h:259
int32_t si32
Definition ojph_defs.h:55
const ui32 log_byte_alignment
Definition ojph_arch.h:287
static ui32 count_trailing_zeros(ui32 val)
Definition ojph_arch.h:240
#define OJPH_EXPORT
Definition ojph_arch.h:123