1*2fb8cbc6SRobert Clausecker /*
2*2fb8cbc6SRobert Clausecker * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
3*2fb8cbc6SRobert Clausecker *
4*2fb8cbc6SRobert Clausecker * SPDX-License-Identifier: BSD-2-Clause
5*2fb8cbc6SRobert Clausecker */
6*2fb8cbc6SRobert Clausecker
7*2fb8cbc6SRobert Clausecker /*
8*2fb8cbc6SRobert Clausecker * test kernel for stdbit functions.
9*2fb8cbc6SRobert Clausecker * Requires the following macros to be defined:
10*2fb8cbc6SRobert Clausecker *
11*2fb8cbc6SRobert Clausecker * FUNCSTEM -- stem of the function name
12*2fb8cbc6SRobert Clausecker * SUFFIX -- type suffic
13*2fb8cbc6SRobert Clausecker * TYPE -- argument type
14*2fb8cbc6SRobert Clausecker * MKREFFUNC(ref, type) -- reference function builder
15*2fb8cbc6SRobert Clausecker */
16*2fb8cbc6SRobert Clausecker
17*2fb8cbc6SRobert Clausecker #define FUNC __CONCAT(FUNCSTEM, SUFFIX)
18*2fb8cbc6SRobert Clausecker #define REF __CONCAT(FUNCSTEM, __CONCAT(SUFFIX, _ref))
19*2fb8cbc6SRobert Clausecker
20*2fb8cbc6SRobert Clausecker MKREFFUNC(REF, TYPE)
21*2fb8cbc6SRobert Clausecker
22*2fb8cbc6SRobert Clausecker ATF_TC_WITHOUT_HEAD1(FUNCSTEM, SUFFIX);
ATF_TC_BODY1(FUNCSTEM,SUFFIX,tc)23*2fb8cbc6SRobert Clausecker ATF_TC_BODY1(FUNCSTEM, SUFFIX, tc)
24*2fb8cbc6SRobert Clausecker {
25*2fb8cbc6SRobert Clausecker uintmax_t has, want;
26*2fb8cbc6SRobert Clausecker size_t i, j;
27*2fb8cbc6SRobert Clausecker TYPE value;
28*2fb8cbc6SRobert Clausecker
29*2fb8cbc6SRobert Clausecker /* test all single-bit patterns */
30*2fb8cbc6SRobert Clausecker for (i = 0; i < TYPE_WIDTH; i++) {
31*2fb8cbc6SRobert Clausecker value = (TYPE)1 << i;
32*2fb8cbc6SRobert Clausecker has = FUNC(value);
33*2fb8cbc6SRobert Clausecker want = REF(value);
34*2fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
35*2fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
36*2fb8cbc6SRobert Clausecker }
37*2fb8cbc6SRobert Clausecker
38*2fb8cbc6SRobert Clausecker /* test all double-bit patterns */
39*2fb8cbc6SRobert Clausecker for (i = 0; i < TYPE_WIDTH; i++) {
40*2fb8cbc6SRobert Clausecker for (j = 0; j < i; j++) {
41*2fb8cbc6SRobert Clausecker value = (TYPE)1 << i | (TYPE)1 << j;
42*2fb8cbc6SRobert Clausecker has = FUNC(value);
43*2fb8cbc6SRobert Clausecker want = REF(value);
44*2fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
45*2fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
46*2fb8cbc6SRobert Clausecker }
47*2fb8cbc6SRobert Clausecker }
48*2fb8cbc6SRobert Clausecker
49*2fb8cbc6SRobert Clausecker /* test all barber-pole patterns */
50*2fb8cbc6SRobert Clausecker value = ~(TYPE)0;
51*2fb8cbc6SRobert Clausecker for (i = 0; i < TYPE_WIDTH; i++) {
52*2fb8cbc6SRobert Clausecker has = FUNC(value);
53*2fb8cbc6SRobert Clausecker want = REF(value);
54*2fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
55*2fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
56*2fb8cbc6SRobert Clausecker
57*2fb8cbc6SRobert Clausecker value = ~value;
58*2fb8cbc6SRobert Clausecker has = FUNC(value);
59*2fb8cbc6SRobert Clausecker want = REF(value);
60*2fb8cbc6SRobert Clausecker ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
61*2fb8cbc6SRobert Clausecker __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
62*2fb8cbc6SRobert Clausecker
63*2fb8cbc6SRobert Clausecker value = ~value << 1;
64*2fb8cbc6SRobert Clausecker }
65*2fb8cbc6SRobert Clausecker }
66*2fb8cbc6SRobert Clausecker
67*2fb8cbc6SRobert Clausecker #undef REF
68*2fb8cbc6SRobert Clausecker #undef FUNC
69