Home | History | Annotate | Line # | Download | only in string
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