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 int stdc_first_trailing_zero_uc(unsigned char x)11*6296500aSRobert Clauseckerstdc_first_trailing_zero_uc(unsigned char x) 12*6296500aSRobert Clausecker { 13*6296500aSRobert Clausecker if (x == UCHAR_MAX) 14*6296500aSRobert Clausecker return (0); 15*6296500aSRobert Clausecker 16*6296500aSRobert Clausecker return (__builtin_ctz(~x) + 1); 17*6296500aSRobert Clausecker } 18*6296500aSRobert Clausecker 19*6296500aSRobert Clausecker unsigned int stdc_first_trailing_zero_us(unsigned short x)20*6296500aSRobert Clauseckerstdc_first_trailing_zero_us(unsigned short x) 21*6296500aSRobert Clausecker { 22*6296500aSRobert Clausecker if (x == USHRT_MAX) 23*6296500aSRobert Clausecker return (0); 24*6296500aSRobert Clausecker 25*6296500aSRobert Clausecker return (__builtin_ctz(~x) + 1); 26*6296500aSRobert Clausecker } 27*6296500aSRobert Clausecker 28*6296500aSRobert Clausecker unsigned int stdc_first_trailing_zero_ui(unsigned int x)29*6296500aSRobert Clauseckerstdc_first_trailing_zero_ui(unsigned int x) 30*6296500aSRobert Clausecker { 31*6296500aSRobert Clausecker if (x == ~0U) 32*6296500aSRobert Clausecker return (0); 33*6296500aSRobert Clausecker 34*6296500aSRobert Clausecker return (__builtin_ctz(~x) + 1); 35*6296500aSRobert Clausecker } 36*6296500aSRobert Clausecker 37*6296500aSRobert Clausecker unsigned int stdc_first_trailing_zero_ul(unsigned long x)38*6296500aSRobert Clauseckerstdc_first_trailing_zero_ul(unsigned long x) 39*6296500aSRobert Clausecker { 40*6296500aSRobert Clausecker if (x == ~0UL) 41*6296500aSRobert Clausecker return (0); 42*6296500aSRobert Clausecker 43*6296500aSRobert Clausecker return (__builtin_ctzl(~x) + 1); 44*6296500aSRobert Clausecker } 45*6296500aSRobert Clausecker 46*6296500aSRobert Clausecker unsigned int stdc_first_trailing_zero_ull(unsigned long long x)47*6296500aSRobert Clauseckerstdc_first_trailing_zero_ull(unsigned long long x) 48*6296500aSRobert Clausecker { 49*6296500aSRobert Clausecker if (x == ~0ULL) 50*6296500aSRobert Clausecker return (0); 51*6296500aSRobert Clausecker 52*6296500aSRobert Clausecker return (__builtin_ctzll(~x) + 1); 53*6296500aSRobert Clausecker } 54