diff --git a/libc/src/__support/builtin_wrappers.h b/libc/src/__support/builtin_wrappers.h --- a/libc/src/__support/builtin_wrappers.h +++ b/libc/src/__support/builtin_wrappers.h @@ -26,6 +26,14 @@ } template static inline int clz(T val); +template <> inline int clz(unsigned short val) { +#if __has_builtin(__builtin_clzs) + return __builtin_clzs(val); +#else + return __builtin_clz(static_cast(val)) - + 8 * (sizeof - sizeof); +#endif +} template <> inline int clz(unsigned int val) { return __builtin_clz(val); } @@ -37,6 +45,13 @@ } template static inline int ctz(T val); +template <> inline int ctz(unsigned short val) { +#if __has_builtin(__builtin_ctzs) + return __builtin_ctzs(val); +#else + return __builtin_ctzs(static_cast(val)); +#endif +} template <> inline int ctz(unsigned int val) { return __builtin_ctz(val); }