xref: /freebsd/lib/libc/stdbit/stdc_bit_floor.c (revision 6296500a85c8474e3ff3fe2f8e4a9d56dd0acd64)
1*6296500aSRobert Clausecker /*
2*6296500aSRobert Clausecker  * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
3*6296500aSRobert Clausecker  *
4*6296500aSRobert Clausecker  * SPDX-License-Identifier: BSD-2-Clause
5*6296500aSRobert Clausecker  */
6*6296500aSRobert Clausecker 
7*6296500aSRobert Clausecker #include <limits.h>
8*6296500aSRobert Clausecker #include <stdbit.h>
9*6296500aSRobert Clausecker 
10*6296500aSRobert Clausecker unsigned char
stdc_bit_floor_uc(unsigned char x)11*6296500aSRobert Clausecker stdc_bit_floor_uc(unsigned char x)
12*6296500aSRobert Clausecker {
13*6296500aSRobert Clausecker 	if (x == 0)
14*6296500aSRobert Clausecker 		return (0);
15*6296500aSRobert Clausecker 
16*6296500aSRobert Clausecker 	return (1U << (UINT_WIDTH - __builtin_clz(x) - 1));
17*6296500aSRobert Clausecker }
18*6296500aSRobert Clausecker 
19*6296500aSRobert Clausecker unsigned short
stdc_bit_floor_us(unsigned short x)20*6296500aSRobert Clausecker stdc_bit_floor_us(unsigned short x)
21*6296500aSRobert Clausecker {
22*6296500aSRobert Clausecker 	if (x == 0)
23*6296500aSRobert Clausecker 		return (0);
24*6296500aSRobert Clausecker 
25*6296500aSRobert Clausecker 	return (1U << (UINT_WIDTH - __builtin_clz(x) - 1));
26*6296500aSRobert Clausecker }
27*6296500aSRobert Clausecker 
28*6296500aSRobert Clausecker unsigned int
stdc_bit_floor_ui(unsigned int x)29*6296500aSRobert Clausecker stdc_bit_floor_ui(unsigned int x)
30*6296500aSRobert Clausecker {
31*6296500aSRobert Clausecker 	if (x == 0)
32*6296500aSRobert Clausecker 		return (0);
33*6296500aSRobert Clausecker 
34*6296500aSRobert Clausecker 	return (1U << (UINT_WIDTH - __builtin_clz(x) - 1));
35*6296500aSRobert Clausecker }
36*6296500aSRobert Clausecker 
37*6296500aSRobert Clausecker unsigned long
stdc_bit_floor_ul(unsigned long x)38*6296500aSRobert Clausecker stdc_bit_floor_ul(unsigned long x)
39*6296500aSRobert Clausecker {
40*6296500aSRobert Clausecker 	if (x == 0)
41*6296500aSRobert Clausecker 		return (0);
42*6296500aSRobert Clausecker 
43*6296500aSRobert Clausecker 	return (1UL << (ULONG_WIDTH - __builtin_clzl(x) - 1));
44*6296500aSRobert Clausecker }
45*6296500aSRobert Clausecker 
46*6296500aSRobert Clausecker unsigned long long
stdc_bit_floor_ull(unsigned long long x)47*6296500aSRobert Clausecker stdc_bit_floor_ull(unsigned long long x)
48*6296500aSRobert Clausecker {
49*6296500aSRobert Clausecker 	if (x == 0)
50*6296500aSRobert Clausecker 		return (0);
51*6296500aSRobert Clausecker 
52*6296500aSRobert Clausecker 	return (1ULL << (ULLONG_WIDTH - __builtin_clzll(x) - 1));
53*6296500aSRobert Clausecker }
54