diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index 0380b925e64c..e2b8c8ede325 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -1,1307 +1,1309 @@ # # Please see the file src/etc/mtree/README before making changes to this file. # /set type=dir uname=root gname=wheel mode=0755 tags=package=tests . atf_python sys net .. netlink .. netpfil ipfw .. .. .. .. bin cat .. chflags .. chmod .. cp .. date .. dd .. echo .. expr .. hostname .. ln .. ls .. mkdir .. mv .. pax .. pkill .. pwait .. rm .. rmdir .. sh builtins .. errors .. execution .. expansion .. invocation .. parameters .. parser .. set-e .. .. sleep .. test .. timeout .. .. cddl lib libtpool .. .. sbin .. usr.bin ctfconvert .. ztest .. .. usr.sbin dtrace amd64 arrays .. .. common aggs .. arithmetic .. arrays .. assocs .. begin .. bitfields .. buffering .. builtinvar .. cg .. clauses .. cpc .. decls .. drops .. dtraceUtil .. end .. enum .. env .. error .. exit .. fbtprovider .. funcs .. grammar .. include .. inline .. io .. ip .. java_api .. json .. kinst .. lexer .. llquantize .. mdb .. mib .. misc .. multiaggs .. offsetof .. oformat .. operators .. pid .. plockstat .. pointers .. pragma .. predicates .. preprocessor .. print .. printa .. printf .. privs .. probes .. proc .. profile-n .. providers .. raise .. rates .. safety .. scalars .. sched .. scripting .. sdt .. sizeof .. speculation .. stability .. stack .. stackdepth .. stop .. strlen .. strtoll .. struct .. sugar .. syscall .. sysevent .. tick-n .. trace .. tracemem .. translators .. typedef .. types .. uctf .. union .. usdt .. ustack .. vars .. version .. .. i386 arrays .. funcs .. pid .. ustack .. .. .. zfsd .. .. .. etc rc.d .. .. examples .. games .. gnu lib .. usr.bin diff .. .. .. include .. lib atf libatf-c detail .. .. libatf-c++ detail .. .. test-programs .. .. csu dynamic .. dynamiclib .. dynamicpie .. errno .. static .. .. googletest gmock .. gmock_main .. gtest .. gtest_main .. .. libarchive .. libbe .. libbsnmp .. libc c063 .. db .. gen execve .. posix_spawn .. .. hash data .. .. iconv .. inet .. locale .. net getaddrinfo data .. .. .. nss .. regex data .. .. resolv .. rpc .. secure .. setjmp .. ssp .. + stdbit + .. stdio .. stdlib .. stdtime .. string .. sys .. termios .. time .. tls dso .. .. ttyio .. .. libcam .. libcasper services cap_dns .. cap_fileargs .. cap_grp .. cap_net .. cap_netdb .. cap_pwd .. cap_sysctl .. .. .. libcrypt .. libdevdctl .. libdiff .. libexecinfo .. libkvm .. libmd .. libmp .. libnv .. libproc .. libregex data .. .. librt .. libsbuf .. libsysdecode .. libthr dlopen .. .. libutil .. libxo .. msun .. .. libexec atf atf-check .. atf-pytest-wrapper .. atf-sh .. .. nuageinit .. rc .. rtld-elf rtld_deepbind .. .. tftpd .. .. sbin bectl .. devd .. dhclient .. growfs .. ifconfig .. ipfw .. md5 .. mdconfig .. newfs_msdos .. nvmecontrol .. pfctl files .. .. ping .. route .. savecore .. swapon .. sysctl .. .. secure lib libcrypto .. .. libexec .. usr.bin .. usr.sbin .. .. share examples tests atf .. googletest .. plain .. tap .. .. .. zoneinfo .. .. sys acl .. aio .. audit .. auditpipe .. cam ctl .. .. capsicum .. cddl zfs bin .. include .. tests acl cifs .. nontrivial .. trivial .. .. atime .. bootfs .. cache .. cachefile .. clean_mirror .. cli_root zdb .. zfs .. zfs_clone .. zfs_copies .. zfs_create .. zfs_destroy .. zfs_diff .. zfs_get .. zfs_inherit .. zfs_mount .. zfs_promote .. zfs_property .. zfs_receive .. zfs_rename .. zfs_reservation .. zfs_rollback .. zfs_send .. zfs_set .. zfs_share .. zfs_snapshot .. zfs_unmount .. zfs_unshare .. zfs_upgrade .. zpool .. zpool_add .. zpool_attach .. zpool_clear .. zpool_create .. zpool_destroy .. zpool_detach .. zpool_expand .. zpool_export .. zpool_get .. zpool_history .. zpool_import blockfiles .. .. zpool_offline .. zpool_online .. zpool_remove .. zpool_replace .. zpool_scrub .. zpool_set .. zpool_status .. zpool_upgrade blockfiles .. .. .. cli_user misc .. zfs_list .. zpool_iostat .. zpool_list .. .. compression .. ctime .. delegate .. devices .. exec .. grow_pool .. grow_replicas .. history .. hotplug .. hotspare .. inheritance .. interop .. inuse .. iscsi .. large_files .. largest_pool .. link_count .. migration .. mmap .. mount .. mv_files .. nestedfs .. no_space .. online_offline .. pool_names .. poolversion .. quota .. redundancy .. refquota .. refreserv .. rename_dirs .. replacement .. reservation .. rootpool .. rsend .. scrub_mirror .. slog .. snapshot .. snapused .. sparse .. threadsappend .. truncate .. txg_integrity .. userquota .. utils_test .. write_dirs .. xattr .. zfsd .. zil .. zinject .. zones .. zvol zvol_ENOSPC .. zvol_cli .. zvol_misc .. zvol_swap .. .. zvol_thrash .. .. .. .. common .. compat32 .. devrandom .. dtrace .. fifo .. file .. fs fusefs .. tarfs .. tmpfs .. .. geom class concat .. eli .. gate .. gpt .. label .. mirror .. multipath .. nop .. part .. raid3 .. shsec .. stripe .. union .. uzip etalon .. .. virstor .. .. .. kern acct .. execve .. pipe .. tty .. .. kqueue libkqueue .. .. mac bsdextended .. ipacl .. portacl .. .. mqueue .. net bpf .. if_ovpn ccd .. .. routing .. .. netgraph .. netinet libalias .. .. netinet6 frag6 .. .. netipsec tunnel .. .. netlink .. netmap .. netpfil common .. ipfw .. pf ioctl .. .. .. opencrypto .. pjdfstest chflags .. chmod .. chown .. ftruncate .. granular .. link .. mkdir .. mkfifo .. mknod .. open .. rename .. rmdir .. symlink .. truncate .. unlink .. utimensat .. .. posixshm .. ses .. sound .. sys .. vfs .. vm stack .. .. vmm .. .. usr.bin apply .. asa .. awk bugs-fixed .. netbsd .. .. basename .. bintrans .. bmake archives fmt_44bsd .. fmt_44bsd_mod .. fmt_oldbsd .. .. basic t0 .. t1 .. t2 .. t3 .. .. execution ellipsis .. empty .. joberr .. plus .. .. shell builtin .. meta .. path .. path_select .. replace .. select .. .. suffixes basic .. src_wild1 .. src_wild2 .. .. syntax directive-t0 .. enl .. funny-targets .. semi .. .. sysmk t0 2 1 .. .. mk .. .. t1 2 1 .. .. mk .. .. t2 2 1 .. .. mk .. .. .. variables modifier_M .. modifier_t .. opt_V .. t0 .. .. .. bsdcat .. calendar .. cmp .. col .. column .. comm .. compress .. cpio .. csplit .. cut .. diff .. diff3 .. dirname .. du .. env .. factor .. file .. file2c .. find .. fold .. getconf .. gh-bc scripts .. tests bc errors .. scripts .. .. dc errors .. scripts .. .. .. .. grep .. gzip .. head .. hexdump .. ident .. indent .. join .. jot .. lam .. lastcomm .. limits .. locale .. lockf .. lorder .. m4 .. mail .. mkimg .. mktemp .. ncal .. opensm .. patch .. pr .. printenv .. printf .. procstat .. renice .. rs .. sdiff .. sed regress.multitest.out .. .. seq .. sockstat .. soelim .. sort .. split .. stat .. tail .. tar .. tee .. tftp .. touch .. tr .. truncate .. tsort .. unifdef .. uniq .. units .. unzip .. vmstat .. wc .. xargs .. xinstall .. xo .. yacc yacc .. .. .. usr.sbin certctl .. chown .. ctladm .. daemon .. etcupdate .. extattr .. fstyp .. jail .. makefs .. mixer .. newsyslog .. nmtree .. praudit .. pw .. quot .. rpcbind .. sa .. syslogd .. sysrc .. traceroute .. .. .. # vim: set expandtab ts=4 sw=4: diff --git a/lib/libc/tests/Makefile b/lib/libc/tests/Makefile index 975c895770ee..ae8e0e937676 100644 --- a/lib/libc/tests/Makefile +++ b/lib/libc/tests/Makefile @@ -1,41 +1,42 @@ .include SUBDIR= tls_dso TESTS_SUBDIRS= c063 TESTS_SUBDIRS+= db TESTS_SUBDIRS+= gen TESTS_SUBDIRS+= hash TESTS_SUBDIRS+= inet TESTS_SUBDIRS+= net TESTS_SUBDIRS+= nss TESTS_SUBDIRS+= regex TESTS_SUBDIRS+= resolv TESTS_SUBDIRS+= rpc TESTS_SUBDIRS+= secure TESTS_SUBDIRS+= setjmp +TESTS_SUBDIRS+= stdbit TESTS_SUBDIRS+= stdio TESTS_SUBDIRS+= stdlib TESTS_SUBDIRS+= stdtime TESTS_SUBDIRS+= string TESTS_SUBDIRS+= sys TESTS_SUBDIRS+= termios TESTS_SUBDIRS+= time TESTS_SUBDIRS+= tls TESTS_SUBDIRS+= ttyio SUBDIR_DEPEND_tls= tls_dso .if ${MK_ICONV} != "no" TESTS_SUBDIRS+= iconv .endif .if ${MK_LOCALES} != "no" TESTS_SUBDIRS+= locale .endif .if ${MK_SSP} != "no" TESTS_SUBDIRS+= ssp .endif .include diff --git a/lib/libc/tests/stdbit/Makefile b/lib/libc/tests/stdbit/Makefile new file mode 100644 index 000000000000..37450056007a --- /dev/null +++ b/lib/libc/tests/stdbit/Makefile @@ -0,0 +1,19 @@ +# ensure libc functions are tested, not clang's builtins +CFLAGS+= -fno-builtin + +ATF_TESTS_C+= stdc_bit_ceil_test \ + stdc_bit_floor_test \ + stdc_bit_width_test \ + stdc_count_ones_test \ + stdc_count_zeros_test \ + stdc_first_leading_one_test \ + stdc_first_leading_zero_test \ + stdc_first_trailing_one_test \ + stdc_first_trailing_zero_test \ + stdc_has_single_bit_test \ + stdc_leading_ones_test \ + stdc_leading_zeros_test \ + stdc_trailing_ones_test \ + stdc_trailing_zeros_test + +.include diff --git a/lib/libc/tests/stdbit/stdbit-test-framework.c b/lib/libc/tests/stdbit/stdbit-test-framework.c new file mode 100644 index 000000000000..368b38fb4745 --- /dev/null +++ b/lib/libc/tests/stdbit/stdbit-test-framework.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +/* + * Test framework for stdbit functions. + * Requires the following macros to be defined: + * + * FUNCSTEM -- name of the function without type suffix + * MKREFFUNC(name, type) -- macro to generate a reference + * implementation of the function as a static function + * named name with give argument type. + */ + +#include +#include +#include +#include +#include + +#define ATF_TC_WITHOUT_HEAD1(stem, suffix) ATF_TC_WITHOUT_HEAD2(__CONCAT(stem, suffix)) +#define ATF_TC_WITHOUT_HEAD2(case) ATF_TC_WITHOUT_HEAD(case) +#define ATF_TC_BODY1(stem, suffix, tc) ATF_TC_BODY2(__CONCAT(stem, suffix), tc) +#define ATF_TC_BODY2(case, tc) ATF_TC_BODY(case, tc) + +#define SUFFIX _uc +#define TYPE unsigned char +#define TYPE_WIDTH UCHAR_WIDTH +#include "stdbit-test-kernel.c" +#undef TYPE_WIDTH +#undef TYPE +#undef SUFFIX + +#define SUFFIX _us +#define TYPE unsigned short +#define TYPE_WIDTH USHRT_WIDTH +#include "stdbit-test-kernel.c" +#undef TYPE_WIDTH +#undef TYPE +#undef SUFFIX + +#define SUFFIX _ui +#define TYPE unsigned int +#define TYPE_WIDTH UINT_WIDTH +#include "stdbit-test-kernel.c" +#undef TYPE_WIDTH +#undef TYPE +#undef SUFFIX + +#define SUFFIX _ul +#define TYPE unsigned long +#define TYPE_WIDTH ULONG_WIDTH +#include "stdbit-test-kernel.c" +#undef TYPE_WIDTH +#undef TYPE +#undef SUFFIX + +#define SUFFIX _ull +#define TYPE unsigned long long +#define TYPE_WIDTH ULLONG_WIDTH +#include "stdbit-test-kernel.c" +#undef TYPE_WIDTH +#undef TYPE +#undef SUFFIX + +#define ADD_CASE(stem, suffix) ADD_CASE1(__CONCAT(stem, suffix)) +#define ADD_CASE1(case) ATF_TP_ADD_TC(tp, case) + +ATF_TP_ADD_TCS(tp) +{ + ADD_CASE(FUNCSTEM, _uc); + ADD_CASE(FUNCSTEM, _us); + ADD_CASE(FUNCSTEM, _ui); + ADD_CASE(FUNCSTEM, _ul); + ADD_CASE(FUNCSTEM, _ull); + + return (atf_no_error()); +} diff --git a/lib/libc/tests/stdbit/stdbit-test-kernel.c b/lib/libc/tests/stdbit/stdbit-test-kernel.c new file mode 100644 index 000000000000..d584e391ff6f --- /dev/null +++ b/lib/libc/tests/stdbit/stdbit-test-kernel.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +/* + * test kernel for stdbit functions. + * Requires the following macros to be defined: + * + * FUNCSTEM -- stem of the function name + * SUFFIX -- type suffic + * TYPE -- argument type + * MKREFFUNC(ref, type) -- reference function builder + */ + +#define FUNC __CONCAT(FUNCSTEM, SUFFIX) +#define REF __CONCAT(FUNCSTEM, __CONCAT(SUFFIX, _ref)) + +MKREFFUNC(REF, TYPE) + +ATF_TC_WITHOUT_HEAD1(FUNCSTEM, SUFFIX); +ATF_TC_BODY1(FUNCSTEM, SUFFIX, tc) +{ + uintmax_t has, want; + size_t i, j; + TYPE value; + + /* test all single-bit patterns */ + for (i = 0; i < TYPE_WIDTH; i++) { + value = (TYPE)1 << i; + has = FUNC(value); + want = REF(value); + ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)", + __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value); + } + + /* test all double-bit patterns */ + for (i = 0; i < TYPE_WIDTH; i++) { + for (j = 0; j < i; j++) { + value = (TYPE)1 << i | (TYPE)1 << j; + has = FUNC(value); + want = REF(value); + ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)", + __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value); + } + } + + /* test all barber-pole patterns */ + value = ~(TYPE)0; + for (i = 0; i < TYPE_WIDTH; i++) { + has = FUNC(value); + want = REF(value); + ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)", + __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value); + + value = ~value; + has = FUNC(value); + want = REF(value); + ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)", + __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value); + + value = ~value << 1; + } +} + +#undef REF +#undef FUNC diff --git a/lib/libc/tests/stdbit/stdc_bit_ceil_test.c b/lib/libc/tests/stdbit/stdc_bit_ceil_test.c new file mode 100644 index 000000000000..0495da55c5d9 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_bit_ceil_test.c @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_bit_ceil +#define MKREFFUNC(name, type) \ + static type \ + name(type value) \ + { \ + type ceil = 1; \ + \ + while (ceil < value && ceil != 0) \ + ceil <<= 1; \ + \ + return (ceil); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_bit_floor_test.c b/lib/libc/tests/stdbit/stdc_bit_floor_test.c new file mode 100644 index 000000000000..a2c5b5f7d8ce --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_bit_floor_test.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_bit_floor +#define MKREFFUNC(name, type) \ + static type \ + name(type value) \ + { \ + type floor = 1; \ + \ + if (value == 0) \ + return (0); \ + \ + while (value != 1) { \ + floor <<= 1; \ + value >>= 1; \ + } \ + \ + return (floor); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_bit_width_test.c b/lib/libc/tests/stdbit/stdc_bit_width_test.c new file mode 100644 index 000000000000..bfcb2b3bd779 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_bit_width_test.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_bit_width +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + unsigned width = 0; \ + \ + while (value != 0) { \ + value >>= 1; \ + width++; \ + } \ + \ + return (width); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_count_ones_test.c b/lib/libc/tests/stdbit/stdc_count_ones_test.c new file mode 100644 index 000000000000..9093edde495b --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_count_ones_test.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_count_ones +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + unsigned count = 0; \ + \ + while (value != 0) { \ + count += value & 1; \ + value >>= 1; \ + } \ + \ + return (count); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_count_zeros_test.c b/lib/libc/tests/stdbit/stdc_count_zeros_test.c new file mode 100644 index 000000000000..a82de6696a64 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_count_zeros_test.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_count_zeros +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + unsigned count = 0; \ + \ + value = ~value; \ + while (value != 0) { \ + count += value & 1; \ + value >>= 1; \ + } \ + \ + return (count); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_first_leading_one_test.c b/lib/libc/tests/stdbit/stdc_first_leading_one_test.c new file mode 100644 index 000000000000..7312789262ea --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_first_leading_one_test.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_first_leading_one +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned pos = 1; \ + \ + if (value == 0) \ + return (0); \ + \ + while ((type)(bit << 1) != 0) \ + bit <<= 1; \ + \ + while ((bit & value) == 0) { \ + bit >>= 1; \ + pos++; \ + } \ + \ + return (pos); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_first_leading_zero_test.c b/lib/libc/tests/stdbit/stdc_first_leading_zero_test.c new file mode 100644 index 000000000000..df2a1f4b8673 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_first_leading_zero_test.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_first_leading_zero +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned pos = 1; \ + \ + value = ~value; \ + if (value == 0) \ + return (0); \ + \ + while ((type)(bit << 1) != 0) \ + bit <<= 1; \ + \ + while ((bit & value) == 0) { \ + bit >>= 1; \ + pos++; \ + } \ + \ + return (pos); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_first_trailing_one_test.c b/lib/libc/tests/stdbit/stdc_first_trailing_one_test.c new file mode 100644 index 000000000000..43284786cd0e --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_first_trailing_one_test.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_first_trailing_one +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned pos = 1; \ + \ + if (value == 0) \ + return (0); \ + \ + while ((bit & value) == 0) { \ + bit <<= 1; \ + pos++; \ + } \ + \ + return (pos); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_first_trailing_zero_test.c b/lib/libc/tests/stdbit/stdc_first_trailing_zero_test.c new file mode 100644 index 000000000000..ab2a995dcc86 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_first_trailing_zero_test.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_first_trailing_zero +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned pos = 1; \ + \ + value = ~value; \ + if (value == 0) \ + return (0); \ + \ + while ((bit & value) == 0) { \ + bit <<= 1; \ + pos++; \ + } \ + \ + return (pos); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_has_single_bit_test.c b/lib/libc/tests/stdbit/stdc_has_single_bit_test.c new file mode 100644 index 000000000000..3426deccd8d0 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_has_single_bit_test.c @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_has_single_bit +#define MKREFFUNC(name, type) \ + static bool \ + name(type value) \ + { \ + type bit; \ + \ + for (bit = 1; bit != 0; bit <<= 1) \ + if (value == bit) \ + return (true); \ + \ + return (false); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_leading_ones_test.c b/lib/libc/tests/stdbit/stdc_leading_ones_test.c new file mode 100644 index 000000000000..616b3d5e6279 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_leading_ones_test.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_leading_ones +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned count = 0; \ + \ + while ((type)(bit << 1) != 0) \ + bit <<= 1; \ + \ + while (bit != 0 && (bit & value) != 0) { \ + bit >>= 1; \ + count++; \ + } \ + \ + return (count); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_leading_zeros_test.c b/lib/libc/tests/stdbit/stdc_leading_zeros_test.c new file mode 100644 index 000000000000..7c9d26e86456 --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_leading_zeros_test.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_leading_zeros +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned count = 0; \ + \ + while ((type)(bit << 1) != 0) \ + bit <<= 1; \ + \ + while (bit != 0 && (bit & value) == 0) { \ + bit >>= 1; \ + count++; \ + } \ + \ + return (count); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_trailing_ones_test.c b/lib/libc/tests/stdbit/stdc_trailing_ones_test.c new file mode 100644 index 000000000000..9e261cc543de --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_trailing_ones_test.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_trailing_ones +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned count = 0; \ + \ + while (bit != 0 && (bit & value) != 0) { \ + bit <<= 1; \ + count++; \ + } \ + \ + return (count); \ + } + +#include "stdbit-test-framework.c" diff --git a/lib/libc/tests/stdbit/stdc_trailing_zeros_test.c b/lib/libc/tests/stdbit/stdc_trailing_zeros_test.c new file mode 100644 index 000000000000..81fe11c5c82a --- /dev/null +++ b/lib/libc/tests/stdbit/stdc_trailing_zeros_test.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2025 Robert Clausecker + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#define FUNCSTEM stdc_trailing_zeros +#define MKREFFUNC(name, type) \ + static unsigned \ + name(type value) \ + { \ + type bit = 1; \ + unsigned count = 0; \ + \ + while (bit != 0 && (bit & value) == 0) { \ + bit <<= 1; \ + count++; \ + } \ + \ + return (count); \ + } + +#include "stdbit-test-framework.c"