xref: /src/lib/libc/stdbit/stdc_bit_width.c (revision 6296500a85c8474e3ff3fe2f8e4a9d56dd0acd64)
16296500aSRobert Clausecker /*
26296500aSRobert Clausecker  * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
36296500aSRobert Clausecker  *
46296500aSRobert Clausecker  * SPDX-License-Identifier: BSD-2-Clause
56296500aSRobert Clausecker  */
66296500aSRobert Clausecker 
76296500aSRobert Clausecker #include <limits.h>
86296500aSRobert Clausecker #include <stdbit.h>
96296500aSRobert Clausecker 
106296500aSRobert Clausecker unsigned int
stdc_bit_width_uc(unsigned char x)116296500aSRobert Clausecker stdc_bit_width_uc(unsigned char x)
126296500aSRobert Clausecker {
136296500aSRobert Clausecker 	if (x == 0)
146296500aSRobert Clausecker 		return (0);
156296500aSRobert Clausecker 
166296500aSRobert Clausecker 	return (UINT_WIDTH - __builtin_clz(x));
176296500aSRobert Clausecker }
186296500aSRobert Clausecker 
196296500aSRobert Clausecker unsigned int
stdc_bit_width_us(unsigned short x)206296500aSRobert Clausecker stdc_bit_width_us(unsigned short x)
216296500aSRobert Clausecker {
226296500aSRobert Clausecker 	if (x == 0)
236296500aSRobert Clausecker 		return (0);
246296500aSRobert Clausecker 
256296500aSRobert Clausecker 	return (UINT_WIDTH - __builtin_clz(x));
266296500aSRobert Clausecker }
276296500aSRobert Clausecker 
286296500aSRobert Clausecker unsigned int
stdc_bit_width_ui(unsigned int x)296296500aSRobert Clausecker stdc_bit_width_ui(unsigned int x)
306296500aSRobert Clausecker {
316296500aSRobert Clausecker 	if (x == 0)
326296500aSRobert Clausecker 		return (0);
336296500aSRobert Clausecker 
346296500aSRobert Clausecker 	return (UINT_WIDTH - __builtin_clz(x));
356296500aSRobert Clausecker }
366296500aSRobert Clausecker 
376296500aSRobert Clausecker unsigned int
stdc_bit_width_ul(unsigned long x)386296500aSRobert Clausecker stdc_bit_width_ul(unsigned long x)
396296500aSRobert Clausecker {
406296500aSRobert Clausecker 	if (x == 0)
416296500aSRobert Clausecker 		return (0);
426296500aSRobert Clausecker 
436296500aSRobert Clausecker 	return (ULONG_WIDTH - __builtin_clzl(x));
446296500aSRobert Clausecker }
456296500aSRobert Clausecker 
466296500aSRobert Clausecker unsigned int
stdc_bit_width_ull(unsigned long long x)476296500aSRobert Clausecker stdc_bit_width_ull(unsigned long long x)
486296500aSRobert Clausecker {
496296500aSRobert Clausecker 	if (x == 0)
506296500aSRobert Clausecker 		return (0);
516296500aSRobert Clausecker 
526296500aSRobert Clausecker 	return (ULLONG_WIDTH - __builtin_clzll(x));
536296500aSRobert Clausecker }
54