summaryrefslogtreecommitdiff
path: root/src/common/bit_util.h
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-03-15 23:18:11 -0400
committerGravatar FernandoS272019-03-27 14:34:29 -0400
commit3bc815a5dc18a646334ba933c74ce7ce44099625 (patch)
tree61229ef6188b264bc7606e62759edd14e5ac2589 /src/common/bit_util.h
parentImplement a MultiLevelQueue (diff)
downloadyuzu-3bc815a5dc18a646334ba933c74ce7ce44099625.tar.gz
yuzu-3bc815a5dc18a646334ba933c74ce7ce44099625.tar.xz
yuzu-3bc815a5dc18a646334ba933c74ce7ce44099625.zip
Implement intrinsics CountTrailingZeroes and test it.
Diffstat (limited to 'src/common/bit_util.h')
-rw-r--r--src/common/bit_util.h45
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
62inline u32 CountTrailingZeroes32(u32 value) { 64inline 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
71inline u64 CountTrailingZeroes64(u64 value) { 74inline 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
84inline u32 CountTrailingZeroes32(u32 value) {
85 if (value == 0) {
86 return 32;
87 }
88
89 return __builtin_ctz(value);
90}
91
92inline 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