xref: /src/lib/libc/stdbit/stdc_first_trailing_zero.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_first_trailing_zero_uc(unsigned char x)116296500aSRobert Clausecker stdc_first_trailing_zero_uc(unsigned char x)
126296500aSRobert Clausecker {
136296500aSRobert Clausecker 	if (x == UCHAR_MAX)
146296500aSRobert Clausecker 		return (0);
156296500aSRobert Clausecker 
166296500aSRobert Clausecker 	return (__builtin_ctz(~x) + 1);
176296500aSRobert Clausecker }
186296500aSRobert Clausecker 
196296500aSRobert Clausecker unsigned int
stdc_first_trailing_zero_us(unsigned short x)206296500aSRobert Clausecker stdc_first_trailing_zero_us(unsigned short x)
216296500aSRobert Clausecker {
226296500aSRobert Clausecker 	if (x == USHRT_MAX)
236296500aSRobert Clausecker 		return (0);
246296500aSRobert Clausecker 
256296500aSRobert Clausecker 	return (__builtin_ctz(~x) + 1);
266296500aSRobert Clausecker }
276296500aSRobert Clausecker 
286296500aSRobert Clausecker unsigned int
stdc_first_trailing_zero_ui(unsigned int x)296296500aSRobert Clausecker stdc_first_trailing_zero_ui(unsigned int x)
306296500aSRobert Clausecker {
316296500aSRobert Clausecker 	if (x == ~0U)
326296500aSRobert Clausecker 		return (0);
336296500aSRobert Clausecker 
346296500aSRobert Clausecker 	return (__builtin_ctz(~x) + 1);
356296500aSRobert Clausecker }
366296500aSRobert Clausecker 
376296500aSRobert Clausecker unsigned int
stdc_first_trailing_zero_ul(unsigned long x)386296500aSRobert Clausecker stdc_first_trailing_zero_ul(unsigned long x)
396296500aSRobert Clausecker {
406296500aSRobert Clausecker 	if (x == ~0UL)
416296500aSRobert Clausecker 		return (0);
426296500aSRobert Clausecker 
436296500aSRobert Clausecker 	return (__builtin_ctzl(~x) + 1);
446296500aSRobert Clausecker }
456296500aSRobert Clausecker 
466296500aSRobert Clausecker unsigned int
stdc_first_trailing_zero_ull(unsigned long long x)476296500aSRobert Clausecker stdc_first_trailing_zero_ull(unsigned long long x)
486296500aSRobert Clausecker {
496296500aSRobert Clausecker 	if (x == ~0ULL)
506296500aSRobert Clausecker 		return (0);
516296500aSRobert Clausecker 
526296500aSRobert Clausecker 	return (__builtin_ctzll(~x) + 1);
536296500aSRobert Clausecker }
54