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