12fb8cbc6SRobert Clausecker /*
22fb8cbc6SRobert Clausecker * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
32fb8cbc6SRobert Clausecker *
42fb8cbc6SRobert Clausecker * SPDX-License-Identifier: BSD-2-Clause
52fb8cbc6SRobert Clausecker */
62fb8cbc6SRobert Clausecker
72fb8cbc6SRobert Clausecker /*
82fb8cbc6SRobert Clausecker * test kernel for stdbit functions.
92fb8cbc6SRobert Clausecker * Requires the following macros to be defined:
102fb8cbc6SRobert Clausecker *
112fb8cbc6SRobert Clausecker * FUNCSTEM -- stem of the function name
122fb8cbc6SRobert Clausecker * SUFFIX -- type suffic
132fb8cbc6SRobert Clausecker * TYPE -- argument type
142fb8cbc6SRobert Clausecker * MKREFFUNC(ref, type) -- reference function builder
152fb8cbc6SRobert Clausecker */
162fb8cbc6SRobert Clausecker
172fb8cbc6SRobert Clausecker #define FUNC __CONCAT(FUNCSTEM, SUFFIX)
182fb8cbc6SRobert Clausecker #define REF __CONCAT(FUNCSTEM, __CONCAT(SUFFIX, _ref))
192fb8cbc6SRobert Clausecker
202fb8cbc6SRobert Clausecker MKREFFUNC(REF, TYPE)
212fb8cbc6SRobert Clausecker
222fb8cbc6SRobert Clausecker ATF_TC_WITHOUT_HEAD1(FUNCSTEM, SUFFIX);
ATF_TC_BODY1(FUNCSTEM,SUFFIX,tc)232fb8cbc6SRobert Clausecker ATF_TC_BODY1(FUNCSTEM, SUFFIX, tc)
242fb8cbc6SRobert Clausecker {
252fb8cbc6SRobert Clausecker uintmax_t has, want;
262fb8cbc6SRobert Clausecker size_t i, j;
272fb8cbc6SRobert Clausecker TYPE value;
282fb8cbc6SRobert Clausecker
292fb8cbc6SRobert Clausecker /* test all single-bit patterns */
302fb8cbc6SRobert Clausecker for (i = 0; i < TYPE_WIDTH; i++) {
312fb8cbc6SRobert Clausecker value = (TYPE)1 << i;
322fb8cbc6SRobert Clausecker has = FUNC(value);
332fb8cbc6SRobert Clausecker want = REF(value);
342fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
352fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
362fb8cbc6SRobert Clausecker }
372fb8cbc6SRobert Clausecker
382fb8cbc6SRobert Clausecker /* test all double-bit patterns */
392fb8cbc6SRobert Clausecker for (i = 0; i < TYPE_WIDTH; i++) {
402fb8cbc6SRobert Clausecker for (j = 0; j < i; j++) {
412fb8cbc6SRobert Clausecker value = (TYPE)1 << i | (TYPE)1 << j;
422fb8cbc6SRobert Clausecker has = FUNC(value);
432fb8cbc6SRobert Clausecker want = REF(value);
442fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
452fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
462fb8cbc6SRobert Clausecker }
472fb8cbc6SRobert Clausecker }
482fb8cbc6SRobert Clausecker
492fb8cbc6SRobert Clausecker /* test all barber-pole patterns */
502fb8cbc6SRobert Clausecker value = ~(TYPE)0;
512fb8cbc6SRobert Clausecker for (i = 0; i < TYPE_WIDTH; i++) {
522fb8cbc6SRobert Clausecker has = FUNC(value);
532fb8cbc6SRobert Clausecker want = REF(value);
542fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
552fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
562fb8cbc6SRobert Clausecker
572fb8cbc6SRobert Clausecker value = ~value;
582fb8cbc6SRobert Clausecker has = FUNC(value);
592fb8cbc6SRobert Clausecker want = REF(value);
602fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
612fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
622fb8cbc6SRobert Clausecker
632fb8cbc6SRobert Clausecker value = ~value << 1;
642fb8cbc6SRobert Clausecker }
652fb8cbc6SRobert Clausecker }
662fb8cbc6SRobert Clausecker
672fb8cbc6SRobert Clausecker #undef REF
682fb8cbc6SRobert Clausecker #undef FUNC
69