diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-05-11 04:12:35 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-06-21 02:36:12 +0200 |
commit | 94f2be5473182789ec3f6388b43fcd708a505500 (patch) | |
tree | 449c07c6f2ca05db69b720543bac5124e6ba7940 /src/common | |
parent | texture_cache: Implement L1_Inner_cache (diff) | |
download | yuzu-94f2be5473182789ec3f6388b43fcd708a505500.tar yuzu-94f2be5473182789ec3f6388b43fcd708a505500.tar.gz yuzu-94f2be5473182789ec3f6388b43fcd708a505500.tar.bz2 yuzu-94f2be5473182789ec3f6388b43fcd708a505500.tar.lz yuzu-94f2be5473182789ec3f6388b43fcd708a505500.tar.xz yuzu-94f2be5473182789ec3f6388b43fcd708a505500.tar.zst yuzu-94f2be5473182789ec3f6388b43fcd708a505500.zip |
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/bit_util.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/common/bit_util.h b/src/common/bit_util.h index d032df413..6f7d5a947 100644 --- a/src/common/bit_util.h +++ b/src/common/bit_util.h @@ -97,4 +97,48 @@ inline u32 CountTrailingZeroes64(u64 value) { } #endif +#ifdef _MSC_VER + +inline u32 MostSignificantBit32(const u32 value) { + unsigned long result; + _BitScanReverse(&result, value); + return static_cast<u32>(result); +} + +inline u32 MostSignificantBit64(const u64 value) { + unsigned long result; + _BitScanReverse64(&result, value); + return static_cast<u32>(result); +} + +#else + +inline u32 MostSignificantBit32(const u32 value) { + return 31U - static_cast<u32>(__builtin_clz(value)); +} + +inline u32 MostSignificantBit64(const u64 value) { + return 63U - static_cast<u32>(__builtin_clzll(value)); +} + +#endif + +inline u32 Log2Floor32(const u32 value) { + return MostSignificantBit32(value); +} + +inline u32 Log2Ceil32(const u32 value) { + const u32 log2_f = Log2Floor32(value); + return log2_f + ((value ^ (1U << log2_f)) != 0U); +} + +inline u32 Log2Floor64(const u64 value) { + return MostSignificantBit64(value); +} + +inline u32 Log2Ceil64(const u64 value) { + const u64 log2_f = static_cast<u64>(Log2Floor64(value)); + return static_cast<u32>(log2_f + ((value ^ (1ULL << log2_f)) != 0ULL)); +} + } // namespace Common |