t_popcount.c revision 1.4 1 1.4 jruoho /* $NetBSD: t_popcount.c,v 1.4 2011/07/07 08:27:36 jruoho Exp $ */
2 1.1 joerg /*-
3 1.1 joerg * Copyright (c) 2009 The NetBSD Foundation, Inc.
4 1.1 joerg * All rights reserved.
5 1.1 joerg *
6 1.1 joerg * This code is derived from software contributed to The NetBSD Foundation
7 1.1 joerg * by Joerg Sonnenberger.
8 1.1 joerg *
9 1.1 joerg * Redistribution and use in source and binary forms, with or without
10 1.1 joerg * modification, are permitted provided that the following conditions
11 1.1 joerg * are met:
12 1.1 joerg *
13 1.1 joerg * 1. Redistributions of source code must retain the above copyright
14 1.1 joerg * notice, this list of conditions and the following disclaimer.
15 1.1 joerg * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 joerg * notice, this list of conditions and the following disclaimer in
17 1.1 joerg * the documentation and/or other materials provided with the
18 1.1 joerg * distribution.
19 1.1 joerg *
20 1.1 joerg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 1.1 joerg * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 1.1 joerg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 1.1 joerg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 1.1 joerg * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 1.1 joerg * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 1.1 joerg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 1.1 joerg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 1.1 joerg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 1.1 joerg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30 1.1 joerg * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 1.1 joerg * SUCH DAMAGE.
32 1.1 joerg */
33 1.1 joerg
34 1.1 joerg #include <sys/cdefs.h>
35 1.4 jruoho __RCSID("$NetBSD: t_popcount.c,v 1.4 2011/07/07 08:27:36 jruoho Exp $");
36 1.1 joerg
37 1.1 joerg #include <atf-c.h>
38 1.1 joerg #include <strings.h>
39 1.1 joerg
40 1.1 joerg static unsigned int byte_count[256];
41 1.1 joerg
42 1.1 joerg static void
43 1.3 pgoyette popcount_init(const char *cfg_var)
44 1.1 joerg {
45 1.1 joerg unsigned int i, j;
46 1.1 joerg
47 1.3 pgoyette if (strcasecmp(cfg_var, "YES") == 0 ||
48 1.3 pgoyette strcasecmp(cfg_var, "Y") == 0 ||
49 1.3 pgoyette strcasecmp(cfg_var, "1") == 0 ||
50 1.3 pgoyette strcasecmp(cfg_var, "T") == 0 ||
51 1.3 pgoyette strcasecmp(cfg_var, "TRUE") == 0) {
52 1.3 pgoyette for (i = 0; i < 256; ++i) {
53 1.3 pgoyette byte_count[i] = 0;
54 1.3 pgoyette for (j = i; j != 0; j >>= 1) {
55 1.3 pgoyette if (j & 1)
56 1.3 pgoyette ++byte_count[i];
57 1.3 pgoyette }
58 1.1 joerg }
59 1.3 pgoyette return;
60 1.1 joerg }
61 1.3 pgoyette
62 1.3 pgoyette atf_tc_skip("config variable \"run_popcount\" not set to YES/TRUE");
63 1.1 joerg }
64 1.1 joerg
65 1.1 joerg unsigned int test_parts[256] = {
66 1.4 jruoho 0x318e53e6U, 0x11710316U, 0x62608ffaU, 0x67e0f562U,
67 1.4 jruoho 0xe432e82cU, 0x9862e8b2U, 0x7d96a627U, 0x3f74ad31U,
68 1.4 jruoho 0x3cecf906U, 0xcdc0dcb4U, 0x241dab64U, 0x31e6133eU,
69 1.4 jruoho 0x23086ad4U, 0x721d5a91U, 0xc483da53U, 0x6a62af52U,
70 1.4 jruoho 0xf3f5c386U, 0xe0de3f77U, 0x65afe528U, 0xf4816485U,
71 1.4 jruoho 0x40ccbf08U, 0x25df49c1U, 0xae5a6ee0U, 0xab36ccadU,
72 1.4 jruoho 0x87e1ec29U, 0x60ca2407U, 0x49d62e47U, 0xa09f2df5U,
73 1.4 jruoho 0xaf4c1c68U, 0x8ef08d50U, 0x624cfd2fU, 0xa6a36f20U,
74 1.4 jruoho 0x68aaf879U, 0x0fe9deabU, 0x5c9a4060U, 0x215d8f08U,
75 1.4 jruoho 0x55e84712U, 0xea1f1681U, 0x3a10b8a1U, 0x08e06632U,
76 1.4 jruoho 0xcbc875e2U, 0x31e53258U, 0xcd3807a4U, 0xb9d17516U,
77 1.4 jruoho 0x8fbfd9abU, 0x6651b555U, 0x550fb381U, 0x05061b9dU,
78 1.4 jruoho 0x35aef3f2U, 0x9175078cU, 0xae0f14daU, 0x92a2d5f8U,
79 1.4 jruoho 0x70d968feU, 0xe86f41c5U, 0x5cfaf39fU, 0x8499b18dU,
80 1.4 jruoho 0xb33f879aU, 0x0a68ad3dU, 0x9323ecc1U, 0x060037ddU,
81 1.4 jruoho 0xb91a5051U, 0xa0dbebf6U, 0x3e6aa6f1U, 0x7b422b5bU,
82 1.4 jruoho 0x599e811eU, 0x199f7594U, 0xca453365U, 0x1cda6f48U,
83 1.4 jruoho 0xe9c75d2cU, 0x6a873217U, 0x79c45d72U, 0x143b8e37U,
84 1.4 jruoho 0xa11df26eU, 0xaf31f80aU, 0x311bf759U, 0x2378563cU,
85 1.4 jruoho 0x9ab95fa5U, 0xfcf4d47cU, 0x1f7db268U, 0xd64b09e1U,
86 1.4 jruoho 0xad7936daU, 0x7a59005cU, 0x45b173d3U, 0xc1a71b32U,
87 1.4 jruoho 0x7d9f0de2U, 0xa9ac3792U, 0x9e7f9966U, 0x7f0b8080U,
88 1.4 jruoho 0xece6c06fU, 0x78d92a3cU, 0x6d5f8f6cU, 0xc50ca544U,
89 1.4 jruoho 0x5d8ded27U, 0xd27a8462U, 0x4bcd13ccU, 0xd49075f2U,
90 1.4 jruoho 0xa8d52acfU, 0x41915d97U, 0x564f7062U, 0xefb046e2U,
91 1.4 jruoho 0xe296277aU, 0x605b0ea3U, 0x10b2c3a1U, 0x4e8e5c66U,
92 1.4 jruoho 0x4bd8ec04U, 0x29935be9U, 0x381839f3U, 0x555d8824U,
93 1.4 jruoho 0xd6befddbU, 0x5d8d6d6eU, 0xb2fdb7b4U, 0xb471c8fcU,
94 1.4 jruoho 0xc2fd325bU, 0x932d2487U, 0xbdbbadefU, 0x66c8895dU,
95 1.4 jruoho 0x5d77857aU, 0x259f1cc0U, 0x302037faU, 0xda9aa7a8U,
96 1.4 jruoho 0xb112c6aaU, 0x78f74192U, 0xfd4da741U, 0xfa5765c1U,
97 1.4 jruoho 0x6ea1bc5cU, 0xd283f39cU, 0x268ae67dU, 0xdedcd134U,
98 1.4 jruoho 0xbbf92410U, 0x6b45fb55U, 0x2f75ac71U, 0x64bf2ca5U,
99 1.4 jruoho 0x8b99675aU, 0x3f4923b6U, 0x7e610550U, 0x04b1c06dU,
100 1.4 jruoho 0x8f92e7c6U, 0x45cb608bU, 0x2d06d1f2U, 0x79cf387aU,
101 1.4 jruoho 0xfd3ed225U, 0x243eee20U, 0x2cbefc6fU, 0x8286cbaaU,
102 1.4 jruoho 0x70d4c182U, 0x054e3cc6U, 0xb66c5362U, 0x0c73fa5dU,
103 1.4 jruoho 0x539948feU, 0xec638563U, 0x0cf04ab6U, 0xec7b52f4U,
104 1.4 jruoho 0x58eeffceU, 0x6fe8049aU, 0xb3b33332U, 0x2e33bfdbU,
105 1.4 jruoho 0xcc817567U, 0x71ac57c8U, 0x4bab3ac7U, 0x327c558bU,
106 1.4 jruoho 0x82a6d279U, 0x5adf71daU, 0x1074a656U, 0x3c533c1fU,
107 1.4 jruoho 0x82fdbe69U, 0x21b4f6afU, 0xd59580e8U, 0x0de824ebU,
108 1.4 jruoho 0xa510941bU, 0x7cd91144U, 0xa8c10631U, 0x4c839267U,
109 1.4 jruoho 0x5d503c2fU, 0xe1567d55U, 0x23910cc7U, 0xdb1bdc34U,
110 1.4 jruoho 0x2a866704U, 0x33e21f0cU, 0x5c7681b4U, 0x818651caU,
111 1.4 jruoho 0xb1d18162U, 0x225ad014U, 0xadf7d6baU, 0xac548d9bU,
112 1.4 jruoho 0xe94736e5U, 0x2279c5f1U, 0x33215d2cU, 0xdc8ab90eU,
113 1.4 jruoho 0xf5e3d7f2U, 0xedcb15cfU, 0xc9a43c4cU, 0xfc678fc6U,
114 1.4 jruoho 0x43796b95U, 0x3f8b700cU, 0x867bbc72U, 0x81f71fecU,
115 1.4 jruoho 0xd00cad7dU, 0x302c458fU, 0x8ae21accU, 0x05850ce8U,
116 1.4 jruoho 0x7764d8e8U, 0x8a36cd68U, 0x40b44bd7U, 0x1cffaeb7U,
117 1.4 jruoho 0x2b248f34U, 0x1eefdbafU, 0x574d7437U, 0xe86cd935U,
118 1.4 jruoho 0xf53dd1c8U, 0x1b022513U, 0xef2d249bU, 0x94fb2b08U,
119 1.4 jruoho 0x15d3eff8U, 0x14245e1bU, 0x82aa8425U, 0x53959028U,
120 1.4 jruoho 0x9c5f9b80U, 0x325e0c82U, 0x3e236c24U, 0x74e1dd36U,
121 1.4 jruoho 0x9890df3fU, 0xaf9701a2U, 0x023b3413U, 0x7634c67eU,
122 1.4 jruoho 0x55cf5e45U, 0x56d2a95bU, 0xb6db869bU, 0xac19e260U,
123 1.4 jruoho 0xdd310740U, 0x26d68f84U, 0x45bebf17U, 0xe4a7728fU,
124 1.4 jruoho 0xf082e66eU, 0xb2fe3c10U, 0x2db1fa2cU, 0x4b3dfcfaU,
125 1.4 jruoho 0xc7b3a672U, 0xaeadc67bU, 0x6cce6f2bU, 0x8263dbbfU,
126 1.4 jruoho 0xd9724d5bU, 0xbcc767b5U, 0x8d563798U, 0x2db764b4U,
127 1.4 jruoho 0x76e0cee7U, 0xd34f9a67U, 0x035c810aU, 0x3f56bdc1U,
128 1.4 jruoho 0x5b3f2c84U, 0x0baca8c0U, 0xfe979a77U, 0x484ca775U,
129 1.4 jruoho 0xbdc7f104U, 0xc06c3efbU, 0xdbc5f32cU, 0x44b017e7U,
130 1.1 joerg };
131 1.1 joerg
132 1.4 jruoho ATF_TC(popcount_basic);
133 1.4 jruoho ATF_TC_HEAD(popcount_basic, tc)
134 1.1 joerg {
135 1.3 pgoyette
136 1.1 joerg atf_tc_set_md_var(tc, "descr", "Test popcount results");
137 1.1 joerg atf_tc_set_md_var(tc, "timeout", "0");
138 1.1 joerg }
139 1.1 joerg
140 1.4 jruoho ATF_TC_BODY(popcount_basic, tc)
141 1.1 joerg {
142 1.1 joerg unsigned int i, r;
143 1.1 joerg
144 1.3 pgoyette popcount_init(atf_tc_get_config_var_wd(tc, "run_popcount", "NO"));
145 1.1 joerg
146 1.1 joerg for (i = 0; i < 0xffffffff; ++i) {
147 1.1 joerg r = byte_count[i & 255] + byte_count[(i >> 8) & 255]
148 1.1 joerg + byte_count[(i >> 16) & 255]
149 1.1 joerg + byte_count[(i >> 24) & 255];
150 1.1 joerg
151 1.1 joerg ATF_CHECK_EQ(r, popcount(i));
152 1.1 joerg }
153 1.1 joerg ATF_CHECK_EQ(popcount(0xffffffff), 32);
154 1.1 joerg }
155 1.1 joerg
156 1.4 jruoho ATF_TC(popcountll_basic);
157 1.4 jruoho ATF_TC_HEAD(popcountll_basic, tc)
158 1.3 pgoyette {
159 1.3 pgoyette
160 1.3 pgoyette atf_tc_set_md_var(tc, "descr", "Test popcountll results");
161 1.3 pgoyette atf_tc_set_md_var(tc, "timeout", "0");
162 1.3 pgoyette }
163 1.3 pgoyette
164 1.4 jruoho ATF_TC_BODY(popcountll_basic, tc)
165 1.1 joerg {
166 1.1 joerg unsigned int i, j, r, r2, p;
167 1.1 joerg unsigned long long v;
168 1.1 joerg
169 1.3 pgoyette popcount_init(atf_tc_get_config_var_wd(tc, "run_popcount", "NO"));
170 1.1 joerg
171 1.1 joerg for (j = 0; j < 256; ++j) {
172 1.1 joerg p = test_parts[j];
173 1.1 joerg r2 = byte_count[p & 255] + byte_count[(p >> 8) & 255]
174 1.1 joerg + byte_count[(p >> 16) & 255]
175 1.1 joerg + byte_count[(p >> 24) & 255];
176 1.1 joerg
177 1.1 joerg for (i = 0; i < 0xffffffff; ++i) {
178 1.1 joerg r = byte_count[i & 255] + byte_count[(i >> 8) & 255]
179 1.1 joerg + byte_count[(i >> 16) & 255]
180 1.1 joerg + byte_count[(i >> 24) & 255] + r2;
181 1.1 joerg
182 1.1 joerg v = (((unsigned long long)i) << 32) + p;
183 1.1 joerg ATF_CHECK_EQ(r, popcountll(v));
184 1.1 joerg v = (((unsigned long long)p) << 32) + i;
185 1.1 joerg ATF_CHECK_EQ(r, popcountll(v));
186 1.1 joerg }
187 1.1 joerg }
188 1.1 joerg
189 1.2 drochner ATF_CHECK_EQ(popcountll(0xffffffffffffffffULL), 64);
190 1.1 joerg }
191 1.1 joerg
192 1.1 joerg ATF_TP_ADD_TCS(tp)
193 1.1 joerg {
194 1.4 jruoho ATF_TP_ADD_TC(tp, popcount_basic);
195 1.4 jruoho ATF_TP_ADD_TC(tp, popcountll_basic);
196 1.1 joerg
197 1.1 joerg return atf_no_error();
198 1.1 joerg }
199