t_popcount.c revision 1.1 1 1.1 joerg /* $NetBSD: t_popcount.c,v 1.1 2009/07/21 13:18:44 joerg 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.1 joerg __RCSID("$NetBSD: t_popcount.c,v 1.1 2009/07/21 13:18:44 joerg 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.1 joerg popcount_init(void)
44 1.1 joerg {
45 1.1 joerg unsigned int i, j;
46 1.1 joerg
47 1.1 joerg for (i = 0; i < 256; ++i) {
48 1.1 joerg byte_count[i] = 0;
49 1.1 joerg for (j = i; j != 0; j >>= 1) {
50 1.1 joerg if (j & 1)
51 1.1 joerg ++byte_count[i];
52 1.1 joerg }
53 1.1 joerg }
54 1.1 joerg }
55 1.1 joerg
56 1.1 joerg unsigned int test_parts[256] = {
57 1.1 joerg 0x318e53e6U, 0x11710316U, 0x62608ffaU, 0x67e0f562U,
58 1.1 joerg 0xe432e82cU, 0x9862e8b2U, 0x7d96a627U, 0x3f74ad31U,
59 1.1 joerg 0x3cecf906U, 0xcdc0dcb4U, 0x241dab64U, 0x31e6133eU,
60 1.1 joerg 0x23086ad4U, 0x721d5a91U, 0xc483da53U, 0x6a62af52U,
61 1.1 joerg 0xf3f5c386U, 0xe0de3f77U, 0x65afe528U, 0xf4816485U,
62 1.1 joerg 0x40ccbf08U, 0x25df49c1U, 0xae5a6ee0U, 0xab36ccadU,
63 1.1 joerg 0x87e1ec29U, 0x60ca2407U, 0x49d62e47U, 0xa09f2df5U,
64 1.1 joerg 0xaf4c1c68U, 0x8ef08d50U, 0x624cfd2fU, 0xa6a36f20U,
65 1.1 joerg 0x68aaf879U, 0x0fe9deabU, 0x5c9a4060U, 0x215d8f08U,
66 1.1 joerg 0x55e84712U, 0xea1f1681U, 0x3a10b8a1U, 0x08e06632U,
67 1.1 joerg 0xcbc875e2U, 0x31e53258U, 0xcd3807a4U, 0xb9d17516U,
68 1.1 joerg 0x8fbfd9abU, 0x6651b555U, 0x550fb381U, 0x05061b9dU,
69 1.1 joerg 0x35aef3f2U, 0x9175078cU, 0xae0f14daU, 0x92a2d5f8U,
70 1.1 joerg 0x70d968feU, 0xe86f41c5U, 0x5cfaf39fU, 0x8499b18dU,
71 1.1 joerg 0xb33f879aU, 0x0a68ad3dU, 0x9323ecc1U, 0x060037ddU,
72 1.1 joerg 0xb91a5051U, 0xa0dbebf6U, 0x3e6aa6f1U, 0x7b422b5bU,
73 1.1 joerg 0x599e811eU, 0x199f7594U, 0xca453365U, 0x1cda6f48U,
74 1.1 joerg 0xe9c75d2cU, 0x6a873217U, 0x79c45d72U, 0x143b8e37U,
75 1.1 joerg 0xa11df26eU, 0xaf31f80aU, 0x311bf759U, 0x2378563cU,
76 1.1 joerg 0x9ab95fa5U, 0xfcf4d47cU, 0x1f7db268U, 0xd64b09e1U,
77 1.1 joerg 0xad7936daU, 0x7a59005cU, 0x45b173d3U, 0xc1a71b32U,
78 1.1 joerg 0x7d9f0de2U, 0xa9ac3792U, 0x9e7f9966U, 0x7f0b8080U,
79 1.1 joerg 0xece6c06fU, 0x78d92a3cU, 0x6d5f8f6cU, 0xc50ca544U,
80 1.1 joerg 0x5d8ded27U, 0xd27a8462U, 0x4bcd13ccU, 0xd49075f2U,
81 1.1 joerg 0xa8d52acfU, 0x41915d97U, 0x564f7062U, 0xefb046e2U,
82 1.1 joerg 0xe296277aU, 0x605b0ea3U, 0x10b2c3a1U, 0x4e8e5c66U,
83 1.1 joerg 0x4bd8ec04U, 0x29935be9U, 0x381839f3U, 0x555d8824U,
84 1.1 joerg 0xd6befddbU, 0x5d8d6d6eU, 0xb2fdb7b4U, 0xb471c8fcU,
85 1.1 joerg 0xc2fd325bU, 0x932d2487U, 0xbdbbadefU, 0x66c8895dU,
86 1.1 joerg 0x5d77857aU, 0x259f1cc0U, 0x302037faU, 0xda9aa7a8U,
87 1.1 joerg 0xb112c6aaU, 0x78f74192U, 0xfd4da741U, 0xfa5765c1U,
88 1.1 joerg 0x6ea1bc5cU, 0xd283f39cU, 0x268ae67dU, 0xdedcd134U,
89 1.1 joerg 0xbbf92410U, 0x6b45fb55U, 0x2f75ac71U, 0x64bf2ca5U,
90 1.1 joerg 0x8b99675aU, 0x3f4923b6U, 0x7e610550U, 0x04b1c06dU,
91 1.1 joerg 0x8f92e7c6U, 0x45cb608bU, 0x2d06d1f2U, 0x79cf387aU,
92 1.1 joerg 0xfd3ed225U, 0x243eee20U, 0x2cbefc6fU, 0x8286cbaaU,
93 1.1 joerg 0x70d4c182U, 0x054e3cc6U, 0xb66c5362U, 0x0c73fa5dU,
94 1.1 joerg 0x539948feU, 0xec638563U, 0x0cf04ab6U, 0xec7b52f4U,
95 1.1 joerg 0x58eeffceU, 0x6fe8049aU, 0xb3b33332U, 0x2e33bfdbU,
96 1.1 joerg 0xcc817567U, 0x71ac57c8U, 0x4bab3ac7U, 0x327c558bU,
97 1.1 joerg 0x82a6d279U, 0x5adf71daU, 0x1074a656U, 0x3c533c1fU,
98 1.1 joerg 0x82fdbe69U, 0x21b4f6afU, 0xd59580e8U, 0x0de824ebU,
99 1.1 joerg 0xa510941bU, 0x7cd91144U, 0xa8c10631U, 0x4c839267U,
100 1.1 joerg 0x5d503c2fU, 0xe1567d55U, 0x23910cc7U, 0xdb1bdc34U,
101 1.1 joerg 0x2a866704U, 0x33e21f0cU, 0x5c7681b4U, 0x818651caU,
102 1.1 joerg 0xb1d18162U, 0x225ad014U, 0xadf7d6baU, 0xac548d9bU,
103 1.1 joerg 0xe94736e5U, 0x2279c5f1U, 0x33215d2cU, 0xdc8ab90eU,
104 1.1 joerg 0xf5e3d7f2U, 0xedcb15cfU, 0xc9a43c4cU, 0xfc678fc6U,
105 1.1 joerg 0x43796b95U, 0x3f8b700cU, 0x867bbc72U, 0x81f71fecU,
106 1.1 joerg 0xd00cad7dU, 0x302c458fU, 0x8ae21accU, 0x05850ce8U,
107 1.1 joerg 0x7764d8e8U, 0x8a36cd68U, 0x40b44bd7U, 0x1cffaeb7U,
108 1.1 joerg 0x2b248f34U, 0x1eefdbafU, 0x574d7437U, 0xe86cd935U,
109 1.1 joerg 0xf53dd1c8U, 0x1b022513U, 0xef2d249bU, 0x94fb2b08U,
110 1.1 joerg 0x15d3eff8U, 0x14245e1bU, 0x82aa8425U, 0x53959028U,
111 1.1 joerg 0x9c5f9b80U, 0x325e0c82U, 0x3e236c24U, 0x74e1dd36U,
112 1.1 joerg 0x9890df3fU, 0xaf9701a2U, 0x023b3413U, 0x7634c67eU,
113 1.1 joerg 0x55cf5e45U, 0x56d2a95bU, 0xb6db869bU, 0xac19e260U,
114 1.1 joerg 0xdd310740U, 0x26d68f84U, 0x45bebf17U, 0xe4a7728fU,
115 1.1 joerg 0xf082e66eU, 0xb2fe3c10U, 0x2db1fa2cU, 0x4b3dfcfaU,
116 1.1 joerg 0xc7b3a672U, 0xaeadc67bU, 0x6cce6f2bU, 0x8263dbbfU,
117 1.1 joerg 0xd9724d5bU, 0xbcc767b5U, 0x8d563798U, 0x2db764b4U,
118 1.1 joerg 0x76e0cee7U, 0xd34f9a67U, 0x035c810aU, 0x3f56bdc1U,
119 1.1 joerg 0x5b3f2c84U, 0x0baca8c0U, 0xfe979a77U, 0x484ca775U,
120 1.1 joerg 0xbdc7f104U, 0xc06c3efbU, 0xdbc5f32cU, 0x44b017e7U,
121 1.1 joerg };
122 1.1 joerg
123 1.1 joerg ATF_TC(t_popcount);
124 1.1 joerg ATF_TC(t_popcountll);
125 1.1 joerg
126 1.1 joerg ATF_TC_HEAD(t_popcount, tc)
127 1.1 joerg {
128 1.1 joerg atf_tc_set_md_var(tc, "descr", "Test popcount results");
129 1.1 joerg atf_tc_set_md_var(tc, "timeout", "0");
130 1.1 joerg }
131 1.1 joerg
132 1.1 joerg ATF_TC_HEAD(t_popcountll, tc)
133 1.1 joerg {
134 1.1 joerg atf_tc_set_md_var(tc, "descr", "Test popcountll results");
135 1.1 joerg atf_tc_set_md_var(tc, "timeout", "0");
136 1.1 joerg }
137 1.1 joerg
138 1.1 joerg ATF_TC_BODY(t_popcount, tc)
139 1.1 joerg {
140 1.1 joerg unsigned int i, r;
141 1.1 joerg
142 1.1 joerg popcount_init();
143 1.1 joerg
144 1.1 joerg for (i = 0; i < 0xffffffff; ++i) {
145 1.1 joerg r = byte_count[i & 255] + byte_count[(i >> 8) & 255]
146 1.1 joerg + byte_count[(i >> 16) & 255]
147 1.1 joerg + byte_count[(i >> 24) & 255];
148 1.1 joerg
149 1.1 joerg ATF_CHECK_EQ(r, popcount(i));
150 1.1 joerg }
151 1.1 joerg ATF_CHECK_EQ(popcount(0xffffffff), 32);
152 1.1 joerg }
153 1.1 joerg
154 1.1 joerg ATF_TC_BODY(t_popcountll, tc)
155 1.1 joerg {
156 1.1 joerg unsigned int i, j, r, r2, p;
157 1.1 joerg unsigned long long v;
158 1.1 joerg
159 1.1 joerg popcount_init();
160 1.1 joerg
161 1.1 joerg for (j = 0; j < 256; ++j) {
162 1.1 joerg p = test_parts[j];
163 1.1 joerg r2 = byte_count[p & 255] + byte_count[(p >> 8) & 255]
164 1.1 joerg + byte_count[(p >> 16) & 255]
165 1.1 joerg + byte_count[(p >> 24) & 255];
166 1.1 joerg
167 1.1 joerg for (i = 0; i < 0xffffffff; ++i) {
168 1.1 joerg r = byte_count[i & 255] + byte_count[(i >> 8) & 255]
169 1.1 joerg + byte_count[(i >> 16) & 255]
170 1.1 joerg + byte_count[(i >> 24) & 255] + r2;
171 1.1 joerg
172 1.1 joerg v = (((unsigned long long)i) << 32) + p;
173 1.1 joerg ATF_CHECK_EQ(r, popcountll(v));
174 1.1 joerg v = (((unsigned long long)p) << 32) + i;
175 1.1 joerg ATF_CHECK_EQ(r, popcountll(v));
176 1.1 joerg }
177 1.1 joerg }
178 1.1 joerg
179 1.1 joerg ATF_CHECK_EQ(popcountll(0xffffffffffffffff), 64);
180 1.1 joerg }
181 1.1 joerg
182 1.1 joerg ATF_TP_ADD_TCS(tp)
183 1.1 joerg {
184 1.1 joerg ATF_TP_ADD_TC(tp, t_popcount);
185 1.1 joerg ATF_TP_ADD_TC(tp, t_popcountll);
186 1.1 joerg
187 1.1 joerg return atf_no_error();
188 1.1 joerg }
189