Assume clz/ctz argument is nonzero in our fallback implementations

This commit is contained in:
Rangi
2026-07-21 13:56:57 -04:00
parent 9cbfec30c7
commit 0d379e9016
+14 -16
View File
@@ -50,42 +50,40 @@ static inline void unreachable_() {
#pragma intrinsic(_BitScanReverse, _BitScanForward) #pragma intrinsic(_BitScanReverse, _BitScanForward)
static inline int ctz(unsigned int x) { static inline int ctz(unsigned int x) {
unsigned long cnt;
assume(x != 0); assume(x != 0);
_BitScanForward(&cnt, x); unsigned long count;
return cnt; _BitScanForward(&count, x);
return count;
} }
static inline int clz(unsigned int x) { static inline int clz(unsigned int x) {
unsigned long cnt;
assume(x != 0); assume(x != 0);
_BitScanReverse(&cnt, x); unsigned long count;
return 31 - cnt; _BitScanReverse(&count, x);
return 31 - count;
} }
#else #else
#include <limits.h> #include <limits.h>
static inline int ctz(unsigned int x) { static inline int ctz(unsigned int x) {
int cnt = 0; assume(x != 0);
int count = 0;
while (!(x & 1)) { while (!(x & 1)) {
x >>= 1; x >>= 1;
++cnt; ++count;
} }
return cnt; return count;
} }
static inline int clz(unsigned int x) { static inline int clz(unsigned int x) {
int cnt = 0; assume(x != 0);
int count = 0;
while (x <= UINT_MAX / 2) { while (x <= UINT_MAX / 2) {
x <<= 1; x <<= 1;
++cnt; ++count;
} }
return cnt; return count;
} }
#endif #endif