diff options
| author | 2019-03-15 23:18:11 -0400 | |
|---|---|---|
| committer | 2019-03-27 14:34:29 -0400 | |
| commit | 3bc815a5dc18a646334ba933c74ce7ce44099625 (patch) | |
| tree | 61229ef6188b264bc7606e62759edd14e5ac2589 /src/common/bit_util.h | |
| parent | Implement a MultiLevelQueue (diff) | |
| download | yuzu-3bc815a5dc18a646334ba933c74ce7ce44099625.tar.gz yuzu-3bc815a5dc18a646334ba933c74ce7ce44099625.tar.xz yuzu-3bc815a5dc18a646334ba933c74ce7ce44099625.zip | |
Implement intrinsics CountTrailingZeroes and test it.
Diffstat (limited to '')
| -rw-r--r-- | src/common/bit_util.h | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/common/bit_util.h b/src/common/bit_util.h index 14e53c273..70e728a5e 100644 --- a/src/common/bit_util.h +++ b/src/common/bit_util.h | |||
| @@ -59,22 +59,43 @@ inline u64 CountLeadingZeroes64(u64 value) { | |||
| 59 | } | 59 | } |
| 60 | #endif | 60 | #endif |
| 61 | 61 | ||
| 62 | |||
| 63 | #ifdef _MSC_VER | ||
| 62 | inline u32 CountTrailingZeroes32(u32 value) { | 64 | inline u32 CountTrailingZeroes32(u32 value) { |
| 63 | u32 count = 0; | 65 | unsigned long trailing_zero = 0; |
| 64 | while (((value >> count) & 0xf) == 0 && count < 32) | 66 | |
| 65 | count += 4; | 67 | if (_BitScanForward(&trailing_zero, value) != 0) { |
| 66 | while (((value >> count) & 1) == 0 && count < 32) | 68 | return trailing_zero; |
| 67 | count++; | 69 | } |
| 68 | return count; | 70 | |
| 71 | return 32; | ||
| 69 | } | 72 | } |
| 70 | 73 | ||
| 71 | inline u64 CountTrailingZeroes64(u64 value) { | 74 | inline u64 CountTrailingZeroes64(u64 value) { |
| 72 | u64 count = 0; | 75 | unsigned long trailing_zero = 0; |
| 73 | while (((value >> count) & 0xf) == 0 && count < 64) | 76 | |
| 74 | count += 4; | 77 | if (_BitScanForward64(&trailing_zero, value) != 0) { |
| 75 | while (((value >> count) & 1) == 0 && count < 64) | 78 | return trailing_zero; |
| 76 | count++; | 79 | } |
| 77 | return count; | 80 | |
| 81 | return 64; | ||
| 78 | } | 82 | } |
| 83 | #else | ||
| 84 | inline u32 CountTrailingZeroes32(u32 value) { | ||
| 85 | if (value == 0) { | ||
| 86 | return 32; | ||
| 87 | } | ||
| 88 | |||
| 89 | return __builtin_ctz(value); | ||
| 90 | } | ||
| 91 | |||
| 92 | inline u64 CountTrailingZeroes64(u64 value) { | ||
| 93 | if (value == 0) { | ||
| 94 | return 64; | ||
| 95 | } | ||
| 96 | |||
| 97 | return __builtin_ctzll(value); | ||
| 98 | } | ||
| 99 | #endif | ||
| 79 | 100 | ||
| 80 | } // namespace Common | 101 | } // namespace Common |