diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index e0f111d84..c52df7f64 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(common audio_stream.cpp audio_stream.h bitfield.h + bitutils.h byte_stream.cpp byte_stream.h cd_image.cpp diff --git a/src/common/bitutils.h b/src/common/bitutils.h new file mode 100644 index 000000000..e4a182422 --- /dev/null +++ b/src/common/bitutils.h @@ -0,0 +1,62 @@ +#pragma once +#include "types.h" + +#ifdef _MSC_VER +#include +#endif + +template +ALWAYS_INLINE unsigned CountLeadingZeros(T value) +{ +#ifdef _MSC_VER + if constexpr (sizeof(value) >= sizeof(u64)) + { + unsigned long index; + return _BitScanReverse64(&index, ZeroExtend64(value)) ? static_cast(index) : 0; + } + else + { + unsigned long index; + return _BitScanReverse(&index, ZeroExtend32(value)) ? static_cast(index) : 0; + } +#else + if constexpr (sizeof(value) >= sizeof(u64)) + { + const unsigned bits = static_cast(__builtin_clzl(ZeroExtend64(value))); + return (value != 0) ? static_cast(bits) : 0; + } + else + { + const unsigned bits = static_cast(__builtin_clz(ZeroExtend32(value))); + return (value != 0) ? static_cast(bits) : 0; + } +#endif +} + +template +ALWAYS_INLINE unsigned CountTrailingZeros(T value) +{ +#ifdef _MSC_VER + if constexpr (sizeof(value) >= sizeof(u64)) + { + unsigned long index; + return _BitScanForward64(&index, ZeroExtend64(value)) ? static_cast(index) : 0; + } + else + { + unsigned long index; + return _BitScanForward(&index, ZeroExtend32(value)) ? static_cast(index) : 0; + } +#else + if constexpr (sizeof(value) >= sizeof(u64)) + { + const unsigned bits = static_cast(__builtin_ctzl(ZeroExtend64(value))); + return (value != 0) ? static_cast(bits) : 0; + } + else + { + const unsigned bits = static_cast(__builtin_ctz(ZeroExtend32(value))); + return (value != 0) ? static_cast(bits) : 0; + } +#endif +} diff --git a/src/common/common.vcxproj b/src/common/common.vcxproj index 9e59e7caa..b098824f2 100644 --- a/src/common/common.vcxproj +++ b/src/common/common.vcxproj @@ -39,6 +39,7 @@ + diff --git a/src/common/common.vcxproj.filters b/src/common/common.vcxproj.filters index a741709c2..f709f26c8 100644 --- a/src/common/common.vcxproj.filters +++ b/src/common/common.vcxproj.filters @@ -57,6 +57,7 @@ gl +