diff options
| author | Robert Clausecker <fuz@FreeBSD.org> | 2025-11-18 17:32:53 +0000 |
|---|---|---|
| committer | Robert Clausecker <fuz@FreeBSD.org> | 2026-01-01 20:51:52 +0000 |
| commit | 275c11b7ccffffb8faf31fb0fb98e99ea5b413da (patch) | |
| tree | 39f4419eb06133ca36f70bade4a26d89564b97f7 /include | |
| parent | 325b327ff7d7ece7646058c4d42f087c026c9d08 (diff) | |
libc: implement C23 <stdbit.h> functions
This new header complies with ISO/IEC 9899:2024 (C23).
Contrary to glibc, we do not provide inline definitions in
<stdbit.h> as we expect our system compiler to soon recognise
these as builtins anyway.
Relnotes: yes
MFC after: 1 month
Reviewed by: adrian
Approved by: markj (mentor)
Differential Revision: https://reviews.freebsd.org/D53657
(cherry picked from commit 6296500a85c8474e3ff3fe2f8e4a9d56dd0acd64)
Diffstat (limited to 'include')
| -rw-r--r-- | include/Makefile | 4 | ||||
| -rw-r--r-- | include/stdbit.h | 124 |
2 files changed, 126 insertions, 2 deletions
diff --git a/include/Makefile b/include/Makefile index 661b2ee131ca..57b2b34f6c6e 100644 --- a/include/Makefile +++ b/include/Makefile @@ -29,8 +29,8 @@ INCS= a.out.h ar.h assert.h bitstring.h byteswap.h \ pthread_np.h pwd.h ranlib.h readpassphrase.h regex.h \ res_update.h resolv.h runetype.h sched.h \ search.h semaphore.h setjmp.h \ - signal.h spawn.h stab.h stdalign.h stdbool.h stdckdint.h stddef.h \ - stdnoreturn.h stdio.h stdlib.h string.h stringlist.h \ + signal.h spawn.h stab.h stdalign.h stdbit.h stdbool.h stdckdint.h \ + stddef.h stdnoreturn.h stdio.h stdlib.h string.h stringlist.h \ strings.h sysexits.h tar.h termios.h tgmath.h \ time.h timeconv.h timers.h ttyent.h \ uchar.h ulimit.h unistd.h utime.h utmpx.h uuid.h varargs.h \ diff --git a/include/stdbit.h b/include/stdbit.h new file mode 100644 index 000000000000..a529676bed4b --- /dev/null +++ b/include/stdbit.h @@ -0,0 +1,124 @@ +/*- + * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#ifndef __STDC_VERSION_STDBIT_H__ +#define __STDC_VERSION_STDBIT_H__ 202311L + +#include <sys/cdefs.h> + +/* byte order */ +#define __STDC_ENDIAN_LITTLE__ __ORDER_LITTLE_ENDIAN__ +#define __STDC_ENDIAN_BIG__ __ORDER_BIG_ENDIAN__ +#define __STDC_ENDIAN_NATIVE__ __BYTE_ORDER__ + +#define __generic_bitfunc(func, x) (_Generic(x, \ + unsigned char: func ## _uc, \ + unsigned short: func ## _us, \ + unsigned int: func ## _ui, \ + unsigned long: func ## _ul, \ + unsigned long long: func ## _ull)(x)) + +__BEGIN_DECLS +unsigned int stdc_leading_zeros_uc(unsigned char) __pure2; +unsigned int stdc_leading_zeros_us(unsigned short) __pure2; +unsigned int stdc_leading_zeros_ui(unsigned int) __pure2; +unsigned int stdc_leading_zeros_ul(unsigned long) __pure2; +unsigned int stdc_leading_zeros_ull(unsigned long long) __pure2; +#define stdc_leading_zeros(x) __generic_bitfunc(stdc_leading_zeros, x) + +unsigned int stdc_leading_ones_uc(unsigned char) __pure2; +unsigned int stdc_leading_ones_us(unsigned short) __pure2; +unsigned int stdc_leading_ones_ui(unsigned int) __pure2; +unsigned int stdc_leading_ones_ul(unsigned long) __pure2; +unsigned int stdc_leading_ones_ull(unsigned long long) __pure2; +#define stdc_leading_ones(x) __generic_bitfunc(stdc_leading_ones, x) + +unsigned int stdc_trailing_zeros_uc(unsigned char) __pure2; +unsigned int stdc_trailing_zeros_us(unsigned short) __pure2; +unsigned int stdc_trailing_zeros_ui(unsigned int) __pure2; +unsigned int stdc_trailing_zeros_ul(unsigned long) __pure2; +unsigned int stdc_trailing_zeros_ull(unsigned long long) __pure2; +#define stdc_trailing_zeros(x) __generic_bitfunc(stdc_trailing_zeros, x) + +unsigned int stdc_trailing_ones_uc(unsigned char) __pure2; +unsigned int stdc_trailing_ones_us(unsigned short) __pure2; +unsigned int stdc_trailing_ones_ui(unsigned int) __pure2; +unsigned int stdc_trailing_ones_ul(unsigned long) __pure2; +unsigned int stdc_trailing_ones_ull(unsigned long long) __pure2; +#define stdc_trailing_ones(x) __generic_bitfunc(stdc_trailing_ones, x) + +unsigned int stdc_first_leading_zero_uc(unsigned char) __pure2; +unsigned int stdc_first_leading_zero_us(unsigned short) __pure2; +unsigned int stdc_first_leading_zero_ui(unsigned int) __pure2; +unsigned int stdc_first_leading_zero_ul(unsigned long) __pure2; +unsigned int stdc_first_leading_zero_ull(unsigned long long) __pure2; +#define stdc_first_leading_zero(x) __generic_bitfunc(stdc_first_leading_zero, x) + +unsigned int stdc_first_leading_one_uc(unsigned char) __pure2; +unsigned int stdc_first_leading_one_us(unsigned short) __pure2; +unsigned int stdc_first_leading_one_ui(unsigned int) __pure2; +unsigned int stdc_first_leading_one_ul(unsigned long) __pure2; +unsigned int stdc_first_leading_one_ull(unsigned long long) __pure2; +#define stdc_first_leading_one(x) __generic_bitfunc(stdc_first_leading_one, x) + +unsigned int stdc_first_trailing_zero_uc(unsigned char) __pure2; +unsigned int stdc_first_trailing_zero_us(unsigned short) __pure2; +unsigned int stdc_first_trailing_zero_ui(unsigned int) __pure2; +unsigned int stdc_first_trailing_zero_ul(unsigned long) __pure2; +unsigned int stdc_first_trailing_zero_ull(unsigned long long) __pure2; +#define stdc_first_trailing_zero(x) __generic_bitfunc(stdc_first_trailing_zero, x) + +unsigned int stdc_first_trailing_one_uc(unsigned char) __pure2; +unsigned int stdc_first_trailing_one_us(unsigned short) __pure2; +unsigned int stdc_first_trailing_one_ui(unsigned int) __pure2; +unsigned int stdc_first_trailing_one_ul(unsigned long) __pure2; +unsigned int stdc_first_trailing_one_ull(unsigned long long) __pure2; +#define stdc_first_trailing_one(x) __generic_bitfunc(stdc_first_trailing_one, x) + +unsigned int stdc_count_zeros_uc(unsigned char) __pure2; +unsigned int stdc_count_zeros_us(unsigned short) __pure2; +unsigned int stdc_count_zeros_ui(unsigned int) __pure2; +unsigned int stdc_count_zeros_ul(unsigned long) __pure2; +unsigned int stdc_count_zeros_ull(unsigned long long) __pure2; +#define stdc_count_zeros(x) __generic_bitfunc(stdc_count_zeros, x) + +unsigned int stdc_count_ones_uc(unsigned char) __pure2; +unsigned int stdc_count_ones_us(unsigned short) __pure2; +unsigned int stdc_count_ones_ui(unsigned int) __pure2; +unsigned int stdc_count_ones_ul(unsigned long) __pure2; +unsigned int stdc_count_ones_ull(unsigned long long) __pure2; +#define stdc_count_ones(x) __generic_bitfunc(stdc_count_ones, x) + +_Bool stdc_has_single_bit_uc(unsigned char) __pure2; +_Bool stdc_has_single_bit_us(unsigned short) __pure2; +_Bool stdc_has_single_bit_ui(unsigned int) __pure2; +_Bool stdc_has_single_bit_ul(unsigned long) __pure2; +_Bool stdc_has_single_bit_ull(unsigned long long) __pure2; +#define stdc_has_single_bit(x) __generic_bitfunc(stdc_has_single_bit, x) + +unsigned int stdc_bit_width_uc(unsigned char) __pure2; +unsigned int stdc_bit_width_us(unsigned short) __pure2; +unsigned int stdc_bit_width_ui(unsigned int) __pure2; +unsigned int stdc_bit_width_ul(unsigned long) __pure2; +unsigned int stdc_bit_width_ull(unsigned long long) __pure2; +#define stdc_bit_width(x) __generic_bitfunc(stdc_bit_width, x) + +unsigned char stdc_bit_floor_uc(unsigned char) __pure2; +unsigned short stdc_bit_floor_us(unsigned short) __pure2; +unsigned stdc_bit_floor_ui(unsigned int) __pure2; +unsigned long stdc_bit_floor_ul(unsigned long) __pure2; +unsigned long long stdc_bit_floor_ull(unsigned long long) __pure2; +#define stdc_bit_floor(x) __generic_bitfunc(stdc_bit_floor, x) + +unsigned char stdc_bit_ceil_uc(unsigned char) __pure2; +unsigned short stdc_bit_ceil_us(unsigned short) __pure2; +unsigned int stdc_bit_ceil_ui(unsigned int) __pure2; +unsigned long stdc_bit_ceil_ul(unsigned long) __pure2; +unsigned long long stdc_bit_ceil_ull(unsigned long long) __pure2; +#define stdc_bit_ceil(x) __generic_bitfunc(stdc_bit_ceil, x) +__END_DECLS + +#endif /* __STDC_VERSION_STDBIT_H__ */ |
