xref: /freebsd/lib/libc/stdbit/stdc_first_trailing_one.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 <stdbit.h>
8*6296500aSRobert Clausecker 
9*6296500aSRobert Clausecker unsigned int
stdc_first_trailing_one_uc(unsigned char x)10*6296500aSRobert Clausecker stdc_first_trailing_one_uc(unsigned char x)
11*6296500aSRobert Clausecker {
12*6296500aSRobert Clausecker 	if (x == 0)
13*6296500aSRobert Clausecker 		return (0);
14*6296500aSRobert Clausecker 
15*6296500aSRobert Clausecker 	return (__builtin_ctz(x) + 1);
16*6296500aSRobert Clausecker }
17*6296500aSRobert Clausecker 
18*6296500aSRobert Clausecker unsigned int
stdc_first_trailing_one_us(unsigned short x)19*6296500aSRobert Clausecker stdc_first_trailing_one_us(unsigned short x)
20*6296500aSRobert Clausecker {
21*6296500aSRobert Clausecker 	if (x == 0)
22*6296500aSRobert Clausecker 		return (0);
23*6296500aSRobert Clausecker 
24*6296500aSRobert Clausecker 	return (__builtin_ctz(x) + 1);
25*6296500aSRobert Clausecker }
26*6296500aSRobert Clausecker 
27*6296500aSRobert Clausecker unsigned int
stdc_first_trailing_one_ui(unsigned int x)28*6296500aSRobert Clausecker stdc_first_trailing_one_ui(unsigned int x)
29*6296500aSRobert Clausecker {
30*6296500aSRobert Clausecker 	if (x == 0)
31*6296500aSRobert Clausecker 		return (0);
32*6296500aSRobert Clausecker 
33*6296500aSRobert Clausecker 	return (__builtin_ctz(x) + 1);
34*6296500aSRobert Clausecker }
35*6296500aSRobert Clausecker 
36*6296500aSRobert Clausecker unsigned int
stdc_first_trailing_one_ul(unsigned long x)37*6296500aSRobert Clausecker stdc_first_trailing_one_ul(unsigned long x)
38*6296500aSRobert Clausecker {
39*6296500aSRobert Clausecker 	if (x == 0)
40*6296500aSRobert Clausecker 		return (0);
41*6296500aSRobert Clausecker 
42*6296500aSRobert Clausecker 	return (__builtin_ctzl(x) + 1);
43*6296500aSRobert Clausecker }
44*6296500aSRobert Clausecker 
45*6296500aSRobert Clausecker unsigned int
stdc_first_trailing_one_ull(unsigned long long x)46*6296500aSRobert Clausecker stdc_first_trailing_one_ull(unsigned long long x)
47*6296500aSRobert Clausecker {
48*6296500aSRobert Clausecker 	if (x == 0)
49*6296500aSRobert Clausecker 		return (0);
50*6296500aSRobert Clausecker 
51*6296500aSRobert Clausecker 	return (__builtin_ctzll(x) + 1);
52*6296500aSRobert Clausecker }
53