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 Clauseckerstdc_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 Clauseckerstdc_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 Clauseckerstdc_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 Clauseckerstdc_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 Clauseckerstdc_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