55#define OJPH_COMPILER_MSVC
56#elif (defined __GNUC__)
57#define OJPH_COMPILER_GNUC
61#define OJPH_EMSCRIPTEN
64#ifdef OJPH_COMPILER_MSVC
71#ifdef OJPH_COMPILER_MSVC
72 #define OJPH_FORCE_INLINE static __forceinline
73 #define OJPH_NO_INLINE static __declspec(noinline)
75 #define OJPH_FORCE_INLINE static inline __attribute__((always_inline))
76 #define OJPH_NO_INLINE static __attribute__((noinline))
82#if defined(__arm__) || defined(__TARGET_ARCH_ARM) \
83 || defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
85#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
86 #define OJPH_ARCH_I386
87#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) \
89 #define OJPH_ARCH_X86_64
90#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
91 #define OJPH_ARCH_IA64
92#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \
93 || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \
94 || defined(_M_MPPC) || defined(_M_PPC)
95 #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
96 #define OJPH_ARCH_PPC64
101 #define OJPH_ARCH_UNKNOWN
105#if defined(OJPH_ARCH_PPC64) && \
106 (defined(__LITTLE_ENDIAN__) || \
107 (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
108 #define OJPH_ARCH_PPC64LE
115#if !defined(OJPH_ARCH_X86_64) && !defined(OJPH_ARCH_I386) && \
116 !defined(OJPH_ARCH_ARM) && !defined(OJPH_ARCH_PPC64LE) && \
117 !defined(OJPH_DISABLE_SIMD)
118#define OJPH_DISABLE_SIMD
124#if (defined WIN32) || (defined _WIN32) || (defined _WIN64)
125#define OJPH_OS_WINDOWS
126#elif (defined __APPLE__)
128#elif (defined __ANDROID__)
129#define OJPH_OS_ANDROID
130#elif (defined __linux)
132#elif (defined __FreeBSD__)
133#define OJPH_OS_FREEBSD
134#elif (defined __OpenBSD__)
135#define OJPH_OS_OPENBSD
141#if defined(OJPH_OS_WINDOWS) && defined(OJPH_BUILD_SHARED_LIBRARY)
142#define OJPH_EXPORT __declspec(dllexport)
188 #if defined(OJPH_COMPILER_MSVC) \
189 && (defined(OJPH_ARCH_X86_64) || defined(OJPH_ARCH_I386))
190 return (
ui32)__popcnt(val);
191 #elif (defined OJPH_COMPILER_GNUC)
192 return (
ui32)__builtin_popcount(val);
194 val -= ((val >> 1) & 0x55555555);
195 val = (((val >> 2) & 0x33333333) + (val & 0x33333333));
196 val = (((val >> 4) + val) & 0x0f0f0f0f);
199 return (
int)(val & 0x0000003f);
204#ifdef OJPH_COMPILER_MSVC
205 #pragma intrinsic(_BitScanReverse)
209 #ifdef OJPH_COMPILER_MSVC
210 unsigned long result = 0;
211 _BitScanReverse(&result, val);
212 return 31 ^ (
ui32)result;
213 #elif (defined OJPH_COMPILER_GNUC)
214 return (
ui32)__builtin_clz(val);
226#ifdef OJPH_COMPILER_MSVC
227 #if (defined OJPH_ARCH_X86_64 || defined OJPH_ARCH_ARM)
228 #pragma intrinsic(_BitScanReverse64)
229 #elif (defined OJPH_ARCH_I386)
230 #pragma intrinsic(_BitScanReverse)
232 #error Error unsupport MSVC version
237 #ifdef OJPH_COMPILER_MSVC
238 unsigned long result = 0;
239 #if (defined OJPH_ARCH_X86_64) || (defined OJPH_ARCH_ARM)
240 _BitScanReverse64(&result, val);
241 #elif (defined OJPH_ARCH_I386)
244 _BitScanReverse(&result, lsb);
246 _BitScanReverse(&result, msb);
250 #error Error unsupport MSVC version
252 return 63 ^ (
ui32)result;
253 #elif (defined OJPH_COMPILER_GNUC)
254 return (
ui32)__builtin_clzll(val);
262 return 64 - population_count64(val);
267#ifdef OJPH_COMPILER_MSVC
268 #pragma intrinsic(_BitScanForward)
272 #ifdef OJPH_COMPILER_MSVC
273 unsigned long result = 0;
274 _BitScanForward(&result, val);
276 #elif (defined OJPH_COMPILER_GNUC)
277 return (
ui32)__builtin_ctz(val);
289#ifdef OJPH_COMPILER_MSVC
290 #pragma intrinsic(_BitScanForward64)
294 #ifdef OJPH_COMPILER_MSVC
295 unsigned long result = 0;
296 #if (defined OJPH_ARCH_X86_64) || (defined OJPH_ARCH_ARM)
297 _BitScanForward64(&result, val);
298 #elif (defined OJPH_ARCH_I386)
301 _BitScanForward(&result, lsb);
303 _BitScanForward(&result, msb);
308 #elif (defined OJPH_COMPILER_GNUC)
309 return (
ui32)__builtin_ctzll(val);
320 #ifdef OJPH_COMPILER_MSVC
321 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
322 #elif (defined OJPH_COMPILER_GNUC)
323 return (
si32)(val + (val >= 0.0f ? 0.5f : -0.5f));
325 return (
si32)round(val);
332 #ifdef OJPH_COMPILER_MSVC
334 #elif (defined OJPH_COMPILER_GNUC)
337 return (
si32)trunc(val);
344 #ifndef OJPH_EMSCRIPTEN
360 template <
typename T, ui32 N>
370 template <
typename T, ui32 N>
372 intptr_t p =
reinterpret_cast<intptr_t
>(ptr);
375 return reinterpret_cast<T *
>(p);
385#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
387#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
389#elif defined(OJPH_COMPILER_MSVC)
397 const uint16_t n = 0x0001;
411 return (
ui16)((t << 8) | (t >> 8));
418 return (
ui16)((t << 8) | (t >> 8));
474 std::memcpy(&val, p,
sizeof(val));
478 return (
ui32)p[0] | ((
ui32)p[1] << 8)
479 | ((
ui32)p[2] << 16) | ((
ui32)p[3] << 24);
490 std::memcpy(&val, p,
sizeof(val));
494 return (
ui32)p[0] | ((
ui32)p[1] << 16);
@ 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 object_alignment
static ui16 swap_bytes_if_le(ui16 t)
const ui32 byte_alignment
const bool is_machine_little_endian
static si32 ojph_round(float val)
static bool check_if_machine_is_little_endian()
static ui32 load_le_ui16x2(const ui16 *p)
static ui32 load_le_ui32(const ui8 *p)
size_t calc_aligned_size(size_t size)
static ui32 population_count(ui32 val)
@ ARM_CPU_EXT_LEVEL_GENERIC
@ ARM_CPU_EXT_LEVEL_ASIMD
@ PPC_CPU_EXT_LEVEL_ARCH_3_1
@ PPC_CPU_EXT_LEVEL_GENERIC
@ PPC_CPU_EXT_LEVEL_ARCH_2_07
@ PPC_CPU_EXT_LEVEL_ARCH_3_00
static ui16 swap_bytes_if_be(ui16 t)
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