1*aaceae98SRobert Mustacchi /* 2*aaceae98SRobert Mustacchi * This file and its contents are supplied under the terms of the 3*aaceae98SRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 4*aaceae98SRobert Mustacchi * You may only use this file in accordance with the terms of version 5*aaceae98SRobert Mustacchi * 1.0 of the CDDL. 6*aaceae98SRobert Mustacchi * 7*aaceae98SRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 8*aaceae98SRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 9*aaceae98SRobert Mustacchi * http://www.illumos.org/license/CDDL. 10*aaceae98SRobert Mustacchi */ 11*aaceae98SRobert Mustacchi 12*aaceae98SRobert Mustacchi /* 13*aaceae98SRobert Mustacchi * Copyright 2024 Oxide Computer Company 14*aaceae98SRobert Mustacchi */ 15*aaceae98SRobert Mustacchi 16*aaceae98SRobert Mustacchi /* 17*aaceae98SRobert Mustacchi * Test various aspects of the libc stdbit(3C) interfaces. This does not test 18*aaceae98SRobert Mustacchi * the generic interfaces so that way this can be built and run by compilers 19*aaceae98SRobert Mustacchi * that don't support C23 and we also want to explicitly test the various type 20*aaceae98SRobert Mustacchi * specific values. 21*aaceae98SRobert Mustacchi * 22*aaceae98SRobert Mustacchi * This test is built 32-bit and 64-bit. The width of a long varies between an 23*aaceae98SRobert Mustacchi * ILP32 and LP64 environment and therefore will end up getting back different 24*aaceae98SRobert Mustacchi * values. Hence the ifdefs. 25*aaceae98SRobert Mustacchi */ 26*aaceae98SRobert Mustacchi 27*aaceae98SRobert Mustacchi #include <stdbit.h> 28*aaceae98SRobert Mustacchi #include <stdlib.h> 29*aaceae98SRobert Mustacchi #include <stdio.h> 30*aaceae98SRobert Mustacchi #include <err.h> 31*aaceae98SRobert Mustacchi #include <sys/debug.h> 32*aaceae98SRobert Mustacchi #include <sys/sysmacros.h> 33*aaceae98SRobert Mustacchi 34*aaceae98SRobert Mustacchi typedef enum { 35*aaceae98SRobert Mustacchi STDBIT_TEST_U8 = 1 << 0, 36*aaceae98SRobert Mustacchi STDBIT_TEST_U16 = 1 << 1, 37*aaceae98SRobert Mustacchi STDBIT_TEST_U32 = 1 << 2, 38*aaceae98SRobert Mustacchi STDBIT_TEST_U64 = 1 << 3 39*aaceae98SRobert Mustacchi } stdbit_test_type_t; 40*aaceae98SRobert Mustacchi 41*aaceae98SRobert Mustacchi #define STDBIT_TEST_64P (STDBIT_TEST_U64) 42*aaceae98SRobert Mustacchi #define STDBIT_TEST_32P (STDBIT_TEST_U32 | STDBIT_TEST_64P) 43*aaceae98SRobert Mustacchi #define STDBIT_TEST_16P (STDBIT_TEST_U16 | STDBIT_TEST_32P) 44*aaceae98SRobert Mustacchi #define STDBIT_TEST_ALL (STDBIT_TEST_U8 | STDBIT_TEST_16P) 45*aaceae98SRobert Mustacchi 46*aaceae98SRobert Mustacchi typedef struct { 47*aaceae98SRobert Mustacchi const char *so_name; 48*aaceae98SRobert Mustacchi unsigned int (*so_uc)(unsigned char); 49*aaceae98SRobert Mustacchi unsigned int (*so_us)(unsigned short); 50*aaceae98SRobert Mustacchi unsigned int (*so_ui)(unsigned int); 51*aaceae98SRobert Mustacchi unsigned int (*so_ul)(unsigned long); 52*aaceae98SRobert Mustacchi unsigned int (*so_ull)(unsigned long long); 53*aaceae98SRobert Mustacchi int32_t so_delta[3]; 54*aaceae98SRobert Mustacchi } stdbit_ops_t; 55*aaceae98SRobert Mustacchi 56*aaceae98SRobert Mustacchi typedef struct { 57*aaceae98SRobert Mustacchi stdbit_test_type_t st_types; 58*aaceae98SRobert Mustacchi uint64_t st_val; 59*aaceae98SRobert Mustacchi uint64_t st_res; 60*aaceae98SRobert Mustacchi } stdbit_test_t; 61*aaceae98SRobert Mustacchi 62*aaceae98SRobert Mustacchi /* 63*aaceae98SRobert Mustacchi * Count Leading Zeros tests. As the integer increases in size, there are a 64*aaceae98SRobert Mustacchi * bunch of leading zeros added, hence the delta values in this entry. 65*aaceae98SRobert Mustacchi */ 66*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_clz_ops = { 67*aaceae98SRobert Mustacchi .so_name = "Count Leading Zeros", 68*aaceae98SRobert Mustacchi .so_uc = stdc_leading_zeros_uc, 69*aaceae98SRobert Mustacchi .so_us = stdc_leading_zeros_us, 70*aaceae98SRobert Mustacchi .so_ui = stdc_leading_zeros_ui, 71*aaceae98SRobert Mustacchi .so_ul = stdc_leading_zeros_ul, 72*aaceae98SRobert Mustacchi .so_ull = stdc_leading_zeros_ull, 73*aaceae98SRobert Mustacchi .so_delta = { 8, 16, 32 } 74*aaceae98SRobert Mustacchi }; 75*aaceae98SRobert Mustacchi 76*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_clz_tests[] = { { 77*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 78*aaceae98SRobert Mustacchi .st_val = 0, 79*aaceae98SRobert Mustacchi .st_res = 8 80*aaceae98SRobert Mustacchi }, { 81*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 82*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 83*aaceae98SRobert Mustacchi .st_res = 0 84*aaceae98SRobert Mustacchi }, { 85*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 86*aaceae98SRobert Mustacchi .st_val = 0x42, 87*aaceae98SRobert Mustacchi .st_res = 1 88*aaceae98SRobert Mustacchi }, { 89*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 90*aaceae98SRobert Mustacchi .st_val = 1, 91*aaceae98SRobert Mustacchi .st_res = 7 92*aaceae98SRobert Mustacchi }, { 93*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 94*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 95*aaceae98SRobert Mustacchi .st_res = 0 96*aaceae98SRobert Mustacchi }, { 97*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 98*aaceae98SRobert Mustacchi .st_val = 0x7777, 99*aaceae98SRobert Mustacchi .st_res = 1 100*aaceae98SRobert Mustacchi }, { 101*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 102*aaceae98SRobert Mustacchi .st_val = 0x800, 103*aaceae98SRobert Mustacchi .st_res = 4 104*aaceae98SRobert Mustacchi }, { 105*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 106*aaceae98SRobert Mustacchi .st_val = 0x080, 107*aaceae98SRobert Mustacchi .st_res = 8 108*aaceae98SRobert Mustacchi }, { 109*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 110*aaceae98SRobert Mustacchi .st_val = 0x008, 111*aaceae98SRobert Mustacchi .st_res = 12 112*aaceae98SRobert Mustacchi }, { 113*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 114*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 115*aaceae98SRobert Mustacchi .st_res = 0 116*aaceae98SRobert Mustacchi }, { 117*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 118*aaceae98SRobert Mustacchi .st_val = 0x23000000, 119*aaceae98SRobert Mustacchi .st_res = 2 120*aaceae98SRobert Mustacchi }, { 121*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 122*aaceae98SRobert Mustacchi .st_val = 0x23000032, 123*aaceae98SRobert Mustacchi .st_res = 2 124*aaceae98SRobert Mustacchi }, { 125*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 126*aaceae98SRobert Mustacchi .st_val = 0x400000000, 127*aaceae98SRobert Mustacchi .st_res = 29 128*aaceae98SRobert Mustacchi }, { 129*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 130*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 131*aaceae98SRobert Mustacchi .st_res = 0 132*aaceae98SRobert Mustacchi } }; 133*aaceae98SRobert Mustacchi 134*aaceae98SRobert Mustacchi /* 135*aaceae98SRobert Mustacchi * Unlike count leading zeros, when we take a value and hand it to a larger 136*aaceae98SRobert Mustacchi * function, it will always go to a value of zero. As a result, we don't test 137*aaceae98SRobert Mustacchi * many of this suite across everything. 138*aaceae98SRobert Mustacchi */ 139*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_clo_ops = { 140*aaceae98SRobert Mustacchi .so_name = "Count Leading Ones", 141*aaceae98SRobert Mustacchi .so_uc = stdc_leading_ones_uc, 142*aaceae98SRobert Mustacchi .so_us = stdc_leading_ones_us, 143*aaceae98SRobert Mustacchi .so_ui = stdc_leading_ones_ui, 144*aaceae98SRobert Mustacchi .so_ul = stdc_leading_ones_ul, 145*aaceae98SRobert Mustacchi .so_ull = stdc_leading_ones_ull, 146*aaceae98SRobert Mustacchi }; 147*aaceae98SRobert Mustacchi 148*aaceae98SRobert Mustacchi 149*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_clo_tests[] = { { 150*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 151*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 152*aaceae98SRobert Mustacchi .st_res = 8 153*aaceae98SRobert Mustacchi }, { 154*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 155*aaceae98SRobert Mustacchi .st_val = 0, 156*aaceae98SRobert Mustacchi .st_res = 0 157*aaceae98SRobert Mustacchi }, { 158*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 159*aaceae98SRobert Mustacchi .st_val = 0x42, 160*aaceae98SRobert Mustacchi .st_res = 0 161*aaceae98SRobert Mustacchi }, { 162*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 163*aaceae98SRobert Mustacchi .st_val = 0xe0, 164*aaceae98SRobert Mustacchi .st_res = 3 165*aaceae98SRobert Mustacchi }, { 166*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 167*aaceae98SRobert Mustacchi .st_val = 0xfc, 168*aaceae98SRobert Mustacchi .st_res = 6 169*aaceae98SRobert Mustacchi }, { 170*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 171*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 172*aaceae98SRobert Mustacchi .st_res = 0 173*aaceae98SRobert Mustacchi }, { 174*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 175*aaceae98SRobert Mustacchi .st_val = 0x142, 176*aaceae98SRobert Mustacchi .st_res = 0 177*aaceae98SRobert Mustacchi }, { 178*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 179*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 180*aaceae98SRobert Mustacchi .st_res = 16 181*aaceae98SRobert Mustacchi }, { 182*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 183*aaceae98SRobert Mustacchi .st_val = 0xc0ff, 184*aaceae98SRobert Mustacchi .st_res = 2 185*aaceae98SRobert Mustacchi }, { 186*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 187*aaceae98SRobert Mustacchi .st_val = 0xf88f, 188*aaceae98SRobert Mustacchi .st_res = 5 189*aaceae98SRobert Mustacchi }, { 190*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 191*aaceae98SRobert Mustacchi .st_val = 0x12345678, 192*aaceae98SRobert Mustacchi .st_res = 0 193*aaceae98SRobert Mustacchi }, { 194*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 195*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 196*aaceae98SRobert Mustacchi .st_res = 32 197*aaceae98SRobert Mustacchi }, { 198*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 199*aaceae98SRobert Mustacchi .st_val = 0x87654321, 200*aaceae98SRobert Mustacchi .st_res = 1 201*aaceae98SRobert Mustacchi }, { 202*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 203*aaceae98SRobert Mustacchi .st_val = 0xff7ff7ff, 204*aaceae98SRobert Mustacchi .st_res = 8 205*aaceae98SRobert Mustacchi }, { 206*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 207*aaceae98SRobert Mustacchi .st_val = 0xfffffeee, 208*aaceae98SRobert Mustacchi .st_res = 23 209*aaceae98SRobert Mustacchi }, { 210*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 211*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 212*aaceae98SRobert Mustacchi .st_res = 64 213*aaceae98SRobert Mustacchi }, { 214*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 215*aaceae98SRobert Mustacchi .st_val = 0x8000000000000000, 216*aaceae98SRobert Mustacchi .st_res = 1 217*aaceae98SRobert Mustacchi }, { 218*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 219*aaceae98SRobert Mustacchi .st_val = 0xffffffff80000000, 220*aaceae98SRobert Mustacchi .st_res = 33 221*aaceae98SRobert Mustacchi }, { 222*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 223*aaceae98SRobert Mustacchi .st_val = 0xffffffffffff9999, 224*aaceae98SRobert Mustacchi .st_res = 49 225*aaceae98SRobert Mustacchi } }; 226*aaceae98SRobert Mustacchi 227*aaceae98SRobert Mustacchi /* 228*aaceae98SRobert Mustacchi * The results for zero is the only special case that occurs with this 229*aaceae98SRobert Mustacchi * particular case. 230*aaceae98SRobert Mustacchi */ 231*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_ctz_ops = { 232*aaceae98SRobert Mustacchi .so_name = "Count Trailing Zeros", 233*aaceae98SRobert Mustacchi .so_uc = stdc_trailing_zeros_uc, 234*aaceae98SRobert Mustacchi .so_us = stdc_trailing_zeros_us, 235*aaceae98SRobert Mustacchi .so_ui = stdc_trailing_zeros_ui, 236*aaceae98SRobert Mustacchi .so_ul = stdc_trailing_zeros_ul, 237*aaceae98SRobert Mustacchi .so_ull = stdc_trailing_zeros_ull, 238*aaceae98SRobert Mustacchi }; 239*aaceae98SRobert Mustacchi 240*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_ctz_tests[] = { { 241*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 242*aaceae98SRobert Mustacchi .st_val = 0, 243*aaceae98SRobert Mustacchi .st_res = 8 244*aaceae98SRobert Mustacchi }, { 245*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 246*aaceae98SRobert Mustacchi .st_val = 0, 247*aaceae98SRobert Mustacchi .st_res = 16 248*aaceae98SRobert Mustacchi }, { 249*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 250*aaceae98SRobert Mustacchi .st_val = 0, 251*aaceae98SRobert Mustacchi .st_res = 32 252*aaceae98SRobert Mustacchi }, { 253*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 254*aaceae98SRobert Mustacchi .st_val = 0, 255*aaceae98SRobert Mustacchi .st_res = 64 256*aaceae98SRobert Mustacchi }, { 257*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 258*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 259*aaceae98SRobert Mustacchi .st_res = 0 260*aaceae98SRobert Mustacchi }, { 261*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 262*aaceae98SRobert Mustacchi .st_val = 0x1, 263*aaceae98SRobert Mustacchi .st_res = 0 264*aaceae98SRobert Mustacchi }, { 265*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 266*aaceae98SRobert Mustacchi .st_val = 0x4, 267*aaceae98SRobert Mustacchi .st_res = 2 268*aaceae98SRobert Mustacchi }, { 269*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 270*aaceae98SRobert Mustacchi .st_val = 0x80, 271*aaceae98SRobert Mustacchi .st_res = 7 272*aaceae98SRobert Mustacchi }, { 273*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 274*aaceae98SRobert Mustacchi .st_val = 0xff60, 275*aaceae98SRobert Mustacchi .st_res = 5 276*aaceae98SRobert Mustacchi }, { 277*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 278*aaceae98SRobert Mustacchi .st_val = 0x8ad0, 279*aaceae98SRobert Mustacchi .st_res = 4 280*aaceae98SRobert Mustacchi }, { 281*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 282*aaceae98SRobert Mustacchi .st_val = 0x2300, 283*aaceae98SRobert Mustacchi .st_res = 8 284*aaceae98SRobert Mustacchi }, { 285*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 286*aaceae98SRobert Mustacchi .st_val = 0x42000000, 287*aaceae98SRobert Mustacchi .st_res = 25 288*aaceae98SRobert Mustacchi }, { 289*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 290*aaceae98SRobert Mustacchi .st_val = 0x99887700, 291*aaceae98SRobert Mustacchi .st_res = 8 292*aaceae98SRobert Mustacchi }, { 293*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 294*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 295*aaceae98SRobert Mustacchi .st_res = 0 296*aaceae98SRobert Mustacchi }, { 297*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 298*aaceae98SRobert Mustacchi .st_val = 0xaa00000000000000, 299*aaceae98SRobert Mustacchi .st_res = 57 300*aaceae98SRobert Mustacchi }, { 301*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 302*aaceae98SRobert Mustacchi .st_val = 0xbadcaf0000000000, 303*aaceae98SRobert Mustacchi .st_res = 40 304*aaceae98SRobert Mustacchi }, { 305*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 306*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 307*aaceae98SRobert Mustacchi .st_res = 0 308*aaceae98SRobert Mustacchi } }; 309*aaceae98SRobert Mustacchi 310*aaceae98SRobert Mustacchi /* 311*aaceae98SRobert Mustacchi * Count Trailing Ones Tests 312*aaceae98SRobert Mustacchi */ 313*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_cto_ops = { 314*aaceae98SRobert Mustacchi .so_name = "Count Trailing Ones", 315*aaceae98SRobert Mustacchi .so_uc = stdc_trailing_ones_uc, 316*aaceae98SRobert Mustacchi .so_us = stdc_trailing_ones_us, 317*aaceae98SRobert Mustacchi .so_ui = stdc_trailing_ones_ui, 318*aaceae98SRobert Mustacchi .so_ul = stdc_trailing_ones_ul, 319*aaceae98SRobert Mustacchi .so_ull = stdc_trailing_ones_ull, 320*aaceae98SRobert Mustacchi }; 321*aaceae98SRobert Mustacchi 322*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_cto_tests[] = { { 323*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 324*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 325*aaceae98SRobert Mustacchi .st_res = 8 326*aaceae98SRobert Mustacchi }, { 327*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 328*aaceae98SRobert Mustacchi .st_val = 0, 329*aaceae98SRobert Mustacchi .st_res = 0 330*aaceae98SRobert Mustacchi }, { 331*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 332*aaceae98SRobert Mustacchi .st_val = 3, 333*aaceae98SRobert Mustacchi .st_res = 2 334*aaceae98SRobert Mustacchi }, { 335*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 336*aaceae98SRobert Mustacchi .st_val = 0x7e, 337*aaceae98SRobert Mustacchi .st_res = 0 338*aaceae98SRobert Mustacchi }, { 339*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 340*aaceae98SRobert Mustacchi .st_val = 0x7f, 341*aaceae98SRobert Mustacchi .st_res = 7 342*aaceae98SRobert Mustacchi }, { 343*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 344*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 345*aaceae98SRobert Mustacchi .st_res = 16 346*aaceae98SRobert Mustacchi }, { 347*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 348*aaceae98SRobert Mustacchi .st_val = 0x8765, 349*aaceae98SRobert Mustacchi .st_res = 1 350*aaceae98SRobert Mustacchi }, { 351*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 352*aaceae98SRobert Mustacchi .st_val = 0xcdef, 353*aaceae98SRobert Mustacchi .st_res = 4 354*aaceae98SRobert Mustacchi }, { 355*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 356*aaceae98SRobert Mustacchi .st_val = 0x9fff, 357*aaceae98SRobert Mustacchi .st_res = 13 358*aaceae98SRobert Mustacchi }, { 359*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 360*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 361*aaceae98SRobert Mustacchi .st_res = 32 362*aaceae98SRobert Mustacchi }, { 363*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 364*aaceae98SRobert Mustacchi .st_val = 0x85ab91ff, 365*aaceae98SRobert Mustacchi .st_res = 9 366*aaceae98SRobert Mustacchi }, { 367*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 368*aaceae98SRobert Mustacchi .st_val = 0x7fffffff, 369*aaceae98SRobert Mustacchi .st_res = 31 370*aaceae98SRobert Mustacchi }, { 371*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 372*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 373*aaceae98SRobert Mustacchi .st_res = 64 374*aaceae98SRobert Mustacchi }, { 375*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 376*aaceae98SRobert Mustacchi .st_val = 0x1bffffffffffffff, 377*aaceae98SRobert Mustacchi .st_res = 58 378*aaceae98SRobert Mustacchi }, { 379*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 380*aaceae98SRobert Mustacchi .st_val = 0x9abe83cff6ff7ff8, 381*aaceae98SRobert Mustacchi .st_res = 0 382*aaceae98SRobert Mustacchi } }; 383*aaceae98SRobert Mustacchi 384*aaceae98SRobert Mustacchi /* 385*aaceae98SRobert Mustacchi * See the manual. The C23 definition for "most-significant" bit is 386*aaceae98SRobert Mustacchi * counter-intuitive. Basically bit 0 is considered the most significant bit. So 387*aaceae98SRobert Mustacchi * for a uint8_t bit 0 is considered index 7 and bit 7 is index 0. The results 388*aaceae98SRobert Mustacchi * always have 1 added to them. 389*aaceae98SRobert Mustacchi */ 390*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_flz_ops = { 391*aaceae98SRobert Mustacchi .so_name = "First Leading Zero", 392*aaceae98SRobert Mustacchi .so_uc = stdc_first_leading_zero_uc, 393*aaceae98SRobert Mustacchi .so_us = stdc_first_leading_zero_us, 394*aaceae98SRobert Mustacchi .so_ui = stdc_first_leading_zero_ui, 395*aaceae98SRobert Mustacchi .so_ul = stdc_first_leading_zero_ul, 396*aaceae98SRobert Mustacchi .so_ull = stdc_first_leading_zero_ull, 397*aaceae98SRobert Mustacchi }; 398*aaceae98SRobert Mustacchi 399*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_flz_tests[] = { { 400*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 401*aaceae98SRobert Mustacchi .st_val = 0, 402*aaceae98SRobert Mustacchi .st_res = 1 403*aaceae98SRobert Mustacchi }, { 404*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 405*aaceae98SRobert Mustacchi .st_val = 0x3, 406*aaceae98SRobert Mustacchi .st_res = 1 407*aaceae98SRobert Mustacchi }, { 408*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 409*aaceae98SRobert Mustacchi .st_val = 0xf0, 410*aaceae98SRobert Mustacchi .st_res = 5 411*aaceae98SRobert Mustacchi }, { 412*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 413*aaceae98SRobert Mustacchi .st_val = 0xef, 414*aaceae98SRobert Mustacchi .st_res = 4 415*aaceae98SRobert Mustacchi }, { 416*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 417*aaceae98SRobert Mustacchi .st_val = 0xc4, 418*aaceae98SRobert Mustacchi .st_res = 3 419*aaceae98SRobert Mustacchi }, { 420*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 421*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 422*aaceae98SRobert Mustacchi .st_res = 0 423*aaceae98SRobert Mustacchi }, { 424*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 425*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 426*aaceae98SRobert Mustacchi .st_res = 1 427*aaceae98SRobert Mustacchi }, { 428*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 429*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 430*aaceae98SRobert Mustacchi .st_res = 0 431*aaceae98SRobert Mustacchi }, { 432*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 433*aaceae98SRobert Mustacchi .st_val = 0xfabc, 434*aaceae98SRobert Mustacchi .st_res = 6 435*aaceae98SRobert Mustacchi }, { 436*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 437*aaceae98SRobert Mustacchi .st_val = 0xcbaf, 438*aaceae98SRobert Mustacchi .st_res = 3 439*aaceae98SRobert Mustacchi }, { 440*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 441*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 442*aaceae98SRobert Mustacchi .st_res = 1 443*aaceae98SRobert Mustacchi }, { 444*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 445*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 446*aaceae98SRobert Mustacchi .st_res = 0 447*aaceae98SRobert Mustacchi }, { 448*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 449*aaceae98SRobert Mustacchi .st_val = 0xff7ff623, 450*aaceae98SRobert Mustacchi .st_res = 9 451*aaceae98SRobert Mustacchi }, { 452*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 453*aaceae98SRobert Mustacchi .st_val = 0xfffff623, 454*aaceae98SRobert Mustacchi .st_res = 21 455*aaceae98SRobert Mustacchi }, { 456*aaceae98SRobert Mustacchi . st_types = STDBIT_TEST_U32, 457*aaceae98SRobert Mustacchi .st_val = 0xffffff95, 458*aaceae98SRobert Mustacchi .st_res = 26 459*aaceae98SRobert Mustacchi }, { 460*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 461*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 462*aaceae98SRobert Mustacchi .st_res = 1 463*aaceae98SRobert Mustacchi }, { 464*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 465*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 466*aaceae98SRobert Mustacchi .st_res = 0 467*aaceae98SRobert Mustacchi }, { 468*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 469*aaceae98SRobert Mustacchi .st_val = 0xfffffffffffffffe, 470*aaceae98SRobert Mustacchi .st_res = 64 471*aaceae98SRobert Mustacchi }, { 472*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 473*aaceae98SRobert Mustacchi .st_val = 0xffff2b9542fffffe, 474*aaceae98SRobert Mustacchi .st_res = 17 475*aaceae98SRobert Mustacchi } }; 476*aaceae98SRobert Mustacchi 477*aaceae98SRobert Mustacchi /* 478*aaceae98SRobert Mustacchi * See the note on the flz tests for the oddities with calculating this. Due to 479*aaceae98SRobert Mustacchi * the nature of how these are counted, the larger the number gets, the more the 480*aaceae98SRobert Mustacchi * first 1 increases in its "most-significant" value. However, we have to 481*aaceae98SRobert Mustacchi * special case 0 in our logic because it will stay consistent across all the 482*aaceae98SRobert Mustacchi * values. 483*aaceae98SRobert Mustacchi */ 484*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_flo_ops = { 485*aaceae98SRobert Mustacchi .so_name = "First Leading One", 486*aaceae98SRobert Mustacchi .so_uc = stdc_first_leading_one_uc, 487*aaceae98SRobert Mustacchi .so_us = stdc_first_leading_one_us, 488*aaceae98SRobert Mustacchi .so_ui = stdc_first_leading_one_ui, 489*aaceae98SRobert Mustacchi .so_ul = stdc_first_leading_one_ul, 490*aaceae98SRobert Mustacchi .so_ull = stdc_first_leading_one_ull, 491*aaceae98SRobert Mustacchi .so_delta = { 8, 16, 32 } 492*aaceae98SRobert Mustacchi }; 493*aaceae98SRobert Mustacchi 494*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_flo_tests[] = { { 495*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 496*aaceae98SRobert Mustacchi .st_val = 0, 497*aaceae98SRobert Mustacchi .st_res = 0 498*aaceae98SRobert Mustacchi }, { 499*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 500*aaceae98SRobert Mustacchi .st_val = 0, 501*aaceae98SRobert Mustacchi .st_res = 0 502*aaceae98SRobert Mustacchi }, { 503*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 504*aaceae98SRobert Mustacchi .st_val = 0, 505*aaceae98SRobert Mustacchi .st_res = 0 506*aaceae98SRobert Mustacchi }, { 507*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 508*aaceae98SRobert Mustacchi .st_val = 0, 509*aaceae98SRobert Mustacchi .st_res = 0 510*aaceae98SRobert Mustacchi }, { 511*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 512*aaceae98SRobert Mustacchi .st_val = 0x1, 513*aaceae98SRobert Mustacchi .st_res = 8 514*aaceae98SRobert Mustacchi }, { 515*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 516*aaceae98SRobert Mustacchi .st_val = 0xf, 517*aaceae98SRobert Mustacchi .st_res = 5 518*aaceae98SRobert Mustacchi }, { 519*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 520*aaceae98SRobert Mustacchi .st_val = 0xfe, 521*aaceae98SRobert Mustacchi .st_res = 1 522*aaceae98SRobert Mustacchi }, { 523*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 524*aaceae98SRobert Mustacchi .st_val = 0x7f, 525*aaceae98SRobert Mustacchi .st_res = 2 526*aaceae98SRobert Mustacchi }, { 527*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 528*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 529*aaceae98SRobert Mustacchi .st_res = 1 530*aaceae98SRobert Mustacchi }, { 531*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 532*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 533*aaceae98SRobert Mustacchi .st_res = 1 534*aaceae98SRobert Mustacchi }, { 535*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 536*aaceae98SRobert Mustacchi .st_val = 0xfeed, 537*aaceae98SRobert Mustacchi .st_res = 1 538*aaceae98SRobert Mustacchi }, { 539*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 540*aaceae98SRobert Mustacchi .st_val = 0x1aff, 541*aaceae98SRobert Mustacchi .st_res = 4 542*aaceae98SRobert Mustacchi }, { 543*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 544*aaceae98SRobert Mustacchi .st_val = 0x02b0, 545*aaceae98SRobert Mustacchi .st_res = 7 546*aaceae98SRobert Mustacchi }, { 547*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 548*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 549*aaceae98SRobert Mustacchi .st_res = 1 550*aaceae98SRobert Mustacchi }, { 551*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 552*aaceae98SRobert Mustacchi .st_val = 0x00001234, 553*aaceae98SRobert Mustacchi .st_res = 20 554*aaceae98SRobert Mustacchi }, { 555*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 556*aaceae98SRobert Mustacchi .st_val = 0x2bb22bb2, 557*aaceae98SRobert Mustacchi .st_res = 3 558*aaceae98SRobert Mustacchi }, { 559*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 560*aaceae98SRobert Mustacchi .st_val = 0x00420000, 561*aaceae98SRobert Mustacchi .st_res = 10 562*aaceae98SRobert Mustacchi }, { 563*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 564*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 565*aaceae98SRobert Mustacchi .st_res = 1 566*aaceae98SRobert Mustacchi }, { 567*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 568*aaceae98SRobert Mustacchi .st_val = 0x000000000c000000, 569*aaceae98SRobert Mustacchi .st_res = 37 570*aaceae98SRobert Mustacchi }, { 571*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 572*aaceae98SRobert Mustacchi .st_val = 0x000fedcba9abcdef, 573*aaceae98SRobert Mustacchi .st_res = 13 574*aaceae98SRobert Mustacchi }, { 575*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 576*aaceae98SRobert Mustacchi .st_val = 0x000001992aa3bb4c, 577*aaceae98SRobert Mustacchi .st_res = 24 578*aaceae98SRobert Mustacchi }, { 579*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 580*aaceae98SRobert Mustacchi .st_val = 0x0706050403020100, 581*aaceae98SRobert Mustacchi .st_res = 6 582*aaceae98SRobert Mustacchi } }; 583*aaceae98SRobert Mustacchi 584*aaceae98SRobert Mustacchi /* 585*aaceae98SRobert Mustacchi * First Trailing Zero. This numbers indexes in the way that someone expects 586*aaceae98SRobert Mustacchi * where the bit 0 is least significant index zero, which returns a value of 1. 587*aaceae98SRobert Mustacchi * When there are no zeros this returns 0. There is no reliable increment 588*aaceae98SRobert Mustacchi * pattern here. 589*aaceae98SRobert Mustacchi */ 590*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_ftz_ops = { 591*aaceae98SRobert Mustacchi .so_name = "First Trailing Zero", 592*aaceae98SRobert Mustacchi .so_uc = stdc_first_trailing_zero_uc, 593*aaceae98SRobert Mustacchi .so_us = stdc_first_trailing_zero_us, 594*aaceae98SRobert Mustacchi .so_ui = stdc_first_trailing_zero_ui, 595*aaceae98SRobert Mustacchi .so_ul = stdc_first_trailing_zero_ul, 596*aaceae98SRobert Mustacchi .so_ull = stdc_first_trailing_zero_ull, 597*aaceae98SRobert Mustacchi }; 598*aaceae98SRobert Mustacchi 599*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_ftz_tests[] = { { 600*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 601*aaceae98SRobert Mustacchi .st_val = 0, 602*aaceae98SRobert Mustacchi .st_res = 1 603*aaceae98SRobert Mustacchi }, { 604*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 605*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 606*aaceae98SRobert Mustacchi .st_res = 0 607*aaceae98SRobert Mustacchi }, { 608*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 609*aaceae98SRobert Mustacchi .st_val = 0xfe, 610*aaceae98SRobert Mustacchi .st_res = 1 611*aaceae98SRobert Mustacchi }, { 612*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 613*aaceae98SRobert Mustacchi .st_val = 0xef, 614*aaceae98SRobert Mustacchi .st_res = 5 615*aaceae98SRobert Mustacchi }, { 616*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U8, 617*aaceae98SRobert Mustacchi .st_val = 0x7f, 618*aaceae98SRobert Mustacchi .st_res = 8 619*aaceae98SRobert Mustacchi }, { 620*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 621*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 622*aaceae98SRobert Mustacchi .st_res = 9 623*aaceae98SRobert Mustacchi }, { 624*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 625*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 626*aaceae98SRobert Mustacchi .st_res = 0 627*aaceae98SRobert Mustacchi }, { 628*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 629*aaceae98SRobert Mustacchi .st_val = 0xfffe, 630*aaceae98SRobert Mustacchi .st_res = 1 631*aaceae98SRobert Mustacchi }, { 632*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 633*aaceae98SRobert Mustacchi .st_val = 0xefff, 634*aaceae98SRobert Mustacchi .st_res = 13 635*aaceae98SRobert Mustacchi }, { 636*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U16, 637*aaceae98SRobert Mustacchi .st_val = 0x07ff, 638*aaceae98SRobert Mustacchi .st_res = 12 639*aaceae98SRobert Mustacchi }, { 640*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 641*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 642*aaceae98SRobert Mustacchi .st_res = 17 643*aaceae98SRobert Mustacchi }, { 644*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 645*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 646*aaceae98SRobert Mustacchi .st_res = 0 647*aaceae98SRobert Mustacchi }, { 648*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 649*aaceae98SRobert Mustacchi .st_val = 0xcaffffff, 650*aaceae98SRobert Mustacchi .st_res = 25 651*aaceae98SRobert Mustacchi }, { 652*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U32, 653*aaceae98SRobert Mustacchi .st_val = 0xcabfffff, 654*aaceae98SRobert Mustacchi .st_res = 23 655*aaceae98SRobert Mustacchi }, { 656*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 657*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 658*aaceae98SRobert Mustacchi .st_res = 33 659*aaceae98SRobert Mustacchi }, { 660*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 661*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 662*aaceae98SRobert Mustacchi .st_res = 0 663*aaceae98SRobert Mustacchi }, { 664*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 665*aaceae98SRobert Mustacchi .st_val = 0xface2bface95a2ff, 666*aaceae98SRobert Mustacchi .st_res = 9 667*aaceae98SRobert Mustacchi }, { 668*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_U64, 669*aaceae98SRobert Mustacchi .st_val = 0x7777777777777777, 670*aaceae98SRobert Mustacchi .st_res = 4 671*aaceae98SRobert Mustacchi } }; 672*aaceae98SRobert Mustacchi 673*aaceae98SRobert Mustacchi /* 674*aaceae98SRobert Mustacchi * First Trailing One. This numbers indexes in the way that someone expects 675*aaceae98SRobert Mustacchi * where the bit 0 is least significant index zero, which returns a value of 1. 676*aaceae98SRobert Mustacchi * When there are no zeros this returns 0. This is classical ffs(). 677*aaceae98SRobert Mustacchi */ 678*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_fto_ops = { 679*aaceae98SRobert Mustacchi .so_name = "First Trailing One", 680*aaceae98SRobert Mustacchi .so_uc = stdc_first_trailing_one_uc, 681*aaceae98SRobert Mustacchi .so_us = stdc_first_trailing_one_us, 682*aaceae98SRobert Mustacchi .so_ui = stdc_first_trailing_one_ui, 683*aaceae98SRobert Mustacchi .so_ul = stdc_first_trailing_one_ul, 684*aaceae98SRobert Mustacchi .so_ull = stdc_first_trailing_one_ull, 685*aaceae98SRobert Mustacchi }; 686*aaceae98SRobert Mustacchi 687*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_fto_tests[] = { { 688*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 689*aaceae98SRobert Mustacchi .st_val = 0, 690*aaceae98SRobert Mustacchi .st_res = 0 691*aaceae98SRobert Mustacchi }, { 692*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 693*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 694*aaceae98SRobert Mustacchi .st_res = 1 695*aaceae98SRobert Mustacchi }, { 696*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 697*aaceae98SRobert Mustacchi .st_val = 0xf7, 698*aaceae98SRobert Mustacchi .st_res = 1 699*aaceae98SRobert Mustacchi }, { 700*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 701*aaceae98SRobert Mustacchi .st_val = 0xf8, 702*aaceae98SRobert Mustacchi .st_res = 4 703*aaceae98SRobert Mustacchi }, { 704*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 705*aaceae98SRobert Mustacchi .st_val = 0x6d, 706*aaceae98SRobert Mustacchi .st_res = 1 707*aaceae98SRobert Mustacchi }, { 708*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 709*aaceae98SRobert Mustacchi .st_val = 0xd6, 710*aaceae98SRobert Mustacchi .st_res = 2 711*aaceae98SRobert Mustacchi }, { 712*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 713*aaceae98SRobert Mustacchi .st_val = 0x40, 714*aaceae98SRobert Mustacchi .st_res = 7 715*aaceae98SRobert Mustacchi }, { 716*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 717*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 718*aaceae98SRobert Mustacchi .st_res = 1 719*aaceae98SRobert Mustacchi }, { 720*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 721*aaceae98SRobert Mustacchi .st_val = 0xf840, 722*aaceae98SRobert Mustacchi .st_res = 7 723*aaceae98SRobert Mustacchi }, { 724*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 725*aaceae98SRobert Mustacchi .st_val = 0x0a00, 726*aaceae98SRobert Mustacchi .st_res = 10 727*aaceae98SRobert Mustacchi }, { 728*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 729*aaceae98SRobert Mustacchi .st_val = 0x8000, 730*aaceae98SRobert Mustacchi .st_res = 16 731*aaceae98SRobert Mustacchi }, { 732*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 733*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 734*aaceae98SRobert Mustacchi .st_res = 1 735*aaceae98SRobert Mustacchi }, { 736*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 737*aaceae98SRobert Mustacchi .st_val = 0xb0000000, 738*aaceae98SRobert Mustacchi .st_res = 29 739*aaceae98SRobert Mustacchi }, { 740*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 741*aaceae98SRobert Mustacchi .st_val = 0xf9c00000, 742*aaceae98SRobert Mustacchi .st_res = 23 743*aaceae98SRobert Mustacchi }, { 744*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 745*aaceae98SRobert Mustacchi .st_val = 0xfed81500, 746*aaceae98SRobert Mustacchi .st_res = 9 747*aaceae98SRobert Mustacchi }, { 748*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 749*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 750*aaceae98SRobert Mustacchi .st_res = 1 751*aaceae98SRobert Mustacchi }, { 752*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 753*aaceae98SRobert Mustacchi .st_val = 0xfed80d0000000000, 754*aaceae98SRobert Mustacchi .st_res = 41 755*aaceae98SRobert Mustacchi }, { 756*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 757*aaceae98SRobert Mustacchi .st_val = 0xff70000000000000, 758*aaceae98SRobert Mustacchi .st_res = 53 759*aaceae98SRobert Mustacchi } }; 760*aaceae98SRobert Mustacchi 761*aaceae98SRobert Mustacchi /* 762*aaceae98SRobert Mustacchi * Count Zeros. 763*aaceae98SRobert Mustacchi */ 764*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_cz_ops = { 765*aaceae98SRobert Mustacchi .so_name = "Count Zeros", 766*aaceae98SRobert Mustacchi .so_uc = stdc_count_zeros_uc, 767*aaceae98SRobert Mustacchi .so_us = stdc_count_zeros_us, 768*aaceae98SRobert Mustacchi .so_ui = stdc_count_zeros_ui, 769*aaceae98SRobert Mustacchi .so_ul = stdc_count_zeros_ul, 770*aaceae98SRobert Mustacchi .so_ull = stdc_count_zeros_ull, 771*aaceae98SRobert Mustacchi .so_delta = { 8, 16, 32 } 772*aaceae98SRobert Mustacchi }; 773*aaceae98SRobert Mustacchi 774*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_cz_tests[] = { { 775*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 776*aaceae98SRobert Mustacchi .st_val = 0, 777*aaceae98SRobert Mustacchi .st_res = 8 778*aaceae98SRobert Mustacchi }, { 779*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 780*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 781*aaceae98SRobert Mustacchi .st_res = 0 782*aaceae98SRobert Mustacchi }, { 783*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 784*aaceae98SRobert Mustacchi .st_val = 0x77, 785*aaceae98SRobert Mustacchi .st_res = 2 786*aaceae98SRobert Mustacchi }, { 787*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 788*aaceae98SRobert Mustacchi .st_val = 0x88, 789*aaceae98SRobert Mustacchi .st_res = 6 790*aaceae98SRobert Mustacchi }, { 791*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 792*aaceae98SRobert Mustacchi .st_val = 0x5, 793*aaceae98SRobert Mustacchi .st_res = 6 794*aaceae98SRobert Mustacchi }, { 795*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 796*aaceae98SRobert Mustacchi .st_val = 0x1f, 797*aaceae98SRobert Mustacchi .st_res = 3 798*aaceae98SRobert Mustacchi }, { 799*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 800*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 801*aaceae98SRobert Mustacchi .st_res = 0 802*aaceae98SRobert Mustacchi }, { 803*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 804*aaceae98SRobert Mustacchi .st_val = 0x1234, 805*aaceae98SRobert Mustacchi .st_res = 11 806*aaceae98SRobert Mustacchi }, { 807*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 808*aaceae98SRobert Mustacchi .st_val = 0x4321, 809*aaceae98SRobert Mustacchi .st_res = 11 810*aaceae98SRobert Mustacchi }, { 811*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 812*aaceae98SRobert Mustacchi .st_val = 0x2ba2, 813*aaceae98SRobert Mustacchi .st_res = 9 814*aaceae98SRobert Mustacchi }, { 815*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 816*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 817*aaceae98SRobert Mustacchi .st_res = 0 818*aaceae98SRobert Mustacchi }, { 819*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 820*aaceae98SRobert Mustacchi .st_val = 0xdeadbeef, 821*aaceae98SRobert Mustacchi .st_res = 8 822*aaceae98SRobert Mustacchi }, { 823*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 824*aaceae98SRobert Mustacchi .st_val = 0x12345678, 825*aaceae98SRobert Mustacchi .st_res = 19 826*aaceae98SRobert Mustacchi }, { 827*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 828*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 829*aaceae98SRobert Mustacchi .st_res = 0 830*aaceae98SRobert Mustacchi }, { 831*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 832*aaceae98SRobert Mustacchi .st_val = 0xabbabccbcddcdeed, 833*aaceae98SRobert Mustacchi .st_res = 22 834*aaceae98SRobert Mustacchi }, { 835*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 836*aaceae98SRobert Mustacchi .st_val = 0x1221244248848008, 837*aaceae98SRobert Mustacchi .st_res = 50 838*aaceae98SRobert Mustacchi }, { 839*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 840*aaceae98SRobert Mustacchi .st_val = 0xfffffffeefffffff, 841*aaceae98SRobert Mustacchi .st_res = 2 842*aaceae98SRobert Mustacchi } }; 843*aaceae98SRobert Mustacchi 844*aaceae98SRobert Mustacchi /* 845*aaceae98SRobert Mustacchi * Count Ones. 846*aaceae98SRobert Mustacchi */ 847*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_co_ops = { 848*aaceae98SRobert Mustacchi .so_name = "Count Ones", 849*aaceae98SRobert Mustacchi .so_uc = stdc_count_ones_uc, 850*aaceae98SRobert Mustacchi .so_us = stdc_count_ones_us, 851*aaceae98SRobert Mustacchi .so_ui = stdc_count_ones_ui, 852*aaceae98SRobert Mustacchi .so_ul = stdc_count_ones_ul, 853*aaceae98SRobert Mustacchi .so_ull = stdc_count_ones_ull, 854*aaceae98SRobert Mustacchi }; 855*aaceae98SRobert Mustacchi 856*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_co_tests[] = { { 857*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 858*aaceae98SRobert Mustacchi .st_val = 0, 859*aaceae98SRobert Mustacchi .st_res = 0 860*aaceae98SRobert Mustacchi }, { 861*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 862*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 863*aaceae98SRobert Mustacchi .st_res = 8 864*aaceae98SRobert Mustacchi }, { 865*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 866*aaceae98SRobert Mustacchi .st_val = 0x77, 867*aaceae98SRobert Mustacchi .st_res = 6 868*aaceae98SRobert Mustacchi }, { 869*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 870*aaceae98SRobert Mustacchi .st_val = 0x88, 871*aaceae98SRobert Mustacchi .st_res = 2 872*aaceae98SRobert Mustacchi }, { 873*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 874*aaceae98SRobert Mustacchi .st_val = 0x5, 875*aaceae98SRobert Mustacchi .st_res = 2 876*aaceae98SRobert Mustacchi }, { 877*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 878*aaceae98SRobert Mustacchi .st_val = 0x1f, 879*aaceae98SRobert Mustacchi .st_res = 5 880*aaceae98SRobert Mustacchi }, { 881*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 882*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 883*aaceae98SRobert Mustacchi .st_res = 16 884*aaceae98SRobert Mustacchi }, { 885*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 886*aaceae98SRobert Mustacchi .st_val = 0x1234, 887*aaceae98SRobert Mustacchi .st_res = 5 888*aaceae98SRobert Mustacchi }, { 889*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 890*aaceae98SRobert Mustacchi .st_val = 0x4321, 891*aaceae98SRobert Mustacchi .st_res = 5 892*aaceae98SRobert Mustacchi }, { 893*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 894*aaceae98SRobert Mustacchi .st_val = 0x2ba2, 895*aaceae98SRobert Mustacchi .st_res = 7 896*aaceae98SRobert Mustacchi }, { 897*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 898*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 899*aaceae98SRobert Mustacchi .st_res = 32 900*aaceae98SRobert Mustacchi }, { 901*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 902*aaceae98SRobert Mustacchi .st_val = 0xdeadbeef, 903*aaceae98SRobert Mustacchi .st_res = 24 904*aaceae98SRobert Mustacchi }, { 905*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 906*aaceae98SRobert Mustacchi .st_val = 0x12345678, 907*aaceae98SRobert Mustacchi .st_res = 13 908*aaceae98SRobert Mustacchi }, { 909*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 910*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 911*aaceae98SRobert Mustacchi .st_res = 64 912*aaceae98SRobert Mustacchi }, { 913*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 914*aaceae98SRobert Mustacchi .st_val = 0xabbabccbcddcdeed, 915*aaceae98SRobert Mustacchi .st_res = 42 916*aaceae98SRobert Mustacchi }, { 917*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 918*aaceae98SRobert Mustacchi .st_val = 0x1221244248848008, 919*aaceae98SRobert Mustacchi .st_res = 14 920*aaceae98SRobert Mustacchi }, { 921*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 922*aaceae98SRobert Mustacchi .st_val = 0xfffffffeefffffff, 923*aaceae98SRobert Mustacchi .st_res = 62 924*aaceae98SRobert Mustacchi } }; 925*aaceae98SRobert Mustacchi 926*aaceae98SRobert Mustacchi /* 927*aaceae98SRobert Mustacchi * Bit width tests. These values should stay the same as we increase integer 928*aaceae98SRobert Mustacchi * sizes as values are only adding zeros. 929*aaceae98SRobert Mustacchi */ 930*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_bw_ops = { 931*aaceae98SRobert Mustacchi .so_name = "Bit Width", 932*aaceae98SRobert Mustacchi .so_uc = stdc_bit_width_uc, 933*aaceae98SRobert Mustacchi .so_us = stdc_bit_width_us, 934*aaceae98SRobert Mustacchi .so_ui = stdc_bit_width_ui, 935*aaceae98SRobert Mustacchi .so_ul = stdc_bit_width_ul, 936*aaceae98SRobert Mustacchi .so_ull = stdc_bit_width_ull, 937*aaceae98SRobert Mustacchi }; 938*aaceae98SRobert Mustacchi 939*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_bw_tests[] = { { 940*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 941*aaceae98SRobert Mustacchi .st_val = 0, 942*aaceae98SRobert Mustacchi .st_res = 0 943*aaceae98SRobert Mustacchi }, { 944*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 945*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 946*aaceae98SRobert Mustacchi .st_res = 8 947*aaceae98SRobert Mustacchi }, { 948*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 949*aaceae98SRobert Mustacchi .st_val = 0x80, 950*aaceae98SRobert Mustacchi .st_res = 8 951*aaceae98SRobert Mustacchi }, { 952*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 953*aaceae98SRobert Mustacchi .st_val = 0x08, 954*aaceae98SRobert Mustacchi .st_res = 4 955*aaceae98SRobert Mustacchi }, { 956*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 957*aaceae98SRobert Mustacchi .st_val = 0x17, 958*aaceae98SRobert Mustacchi .st_res = 5 959*aaceae98SRobert Mustacchi }, { 960*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 961*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 962*aaceae98SRobert Mustacchi .st_res = 16 963*aaceae98SRobert Mustacchi }, { 964*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 965*aaceae98SRobert Mustacchi .st_val = 0x7777, 966*aaceae98SRobert Mustacchi .st_res = 15 967*aaceae98SRobert Mustacchi }, { 968*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 969*aaceae98SRobert Mustacchi .st_val = 0x2bb2, 970*aaceae98SRobert Mustacchi .st_res = 14 971*aaceae98SRobert Mustacchi }, { 972*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 973*aaceae98SRobert Mustacchi .st_val = 0x0230, 974*aaceae98SRobert Mustacchi .st_res = 10 975*aaceae98SRobert Mustacchi }, { 976*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 977*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 978*aaceae98SRobert Mustacchi .st_res = 32 979*aaceae98SRobert Mustacchi }, { 980*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 981*aaceae98SRobert Mustacchi .st_val = 0xfedc4000, 982*aaceae98SRobert Mustacchi .st_res = 32 983*aaceae98SRobert Mustacchi }, { 984*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 985*aaceae98SRobert Mustacchi .st_val = 0x0004cedf, 986*aaceae98SRobert Mustacchi .st_res = 19 987*aaceae98SRobert Mustacchi }, { 988*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 989*aaceae98SRobert Mustacchi .st_val = 0x001ee100, 990*aaceae98SRobert Mustacchi .st_res = 21 991*aaceae98SRobert Mustacchi }, { 992*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 993*aaceae98SRobert Mustacchi .st_val = 0x8000000000000000, 994*aaceae98SRobert Mustacchi .st_res = 64 995*aaceae98SRobert Mustacchi }, { 996*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 997*aaceae98SRobert Mustacchi .st_val = 0x00ff11ee22dd33cc, 998*aaceae98SRobert Mustacchi .st_res = 56 999*aaceae98SRobert Mustacchi }, { 1000*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 1001*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 1002*aaceae98SRobert Mustacchi .st_res = 64 1003*aaceae98SRobert Mustacchi } }; 1004*aaceae98SRobert Mustacchi 1005*aaceae98SRobert Mustacchi static void 1006*aaceae98SRobert Mustacchi stdbit_print_pass(stdbit_test_type_t types, uint64_t val, const char *cat) 1007*aaceae98SRobert Mustacchi { 1008*aaceae98SRobert Mustacchi bool first = true; 1009*aaceae98SRobert Mustacchi (void) printf("TEST PASSED: %s (0x%" PRIx64 ") [", cat, val); 1010*aaceae98SRobert Mustacchi if ((types & STDBIT_TEST_U8) != 0) { 1011*aaceae98SRobert Mustacchi (void) printf("8"); 1012*aaceae98SRobert Mustacchi first = false; 1013*aaceae98SRobert Mustacchi } 1014*aaceae98SRobert Mustacchi 1015*aaceae98SRobert Mustacchi if ((types & STDBIT_TEST_U16) != 0) { 1016*aaceae98SRobert Mustacchi (void) printf("%s16", first ? "" : ","); 1017*aaceae98SRobert Mustacchi first = false; 1018*aaceae98SRobert Mustacchi } 1019*aaceae98SRobert Mustacchi 1020*aaceae98SRobert Mustacchi if ((types & STDBIT_TEST_U32) != 0) { 1021*aaceae98SRobert Mustacchi (void) printf("%s32", first ? "" : ","); 1022*aaceae98SRobert Mustacchi first = false; 1023*aaceae98SRobert Mustacchi } 1024*aaceae98SRobert Mustacchi 1025*aaceae98SRobert Mustacchi if ((types & STDBIT_TEST_U64) != 0) { 1026*aaceae98SRobert Mustacchi (void) printf("%s64", first ? "" : ","); 1027*aaceae98SRobert Mustacchi first = false; 1028*aaceae98SRobert Mustacchi } 1029*aaceae98SRobert Mustacchi 1030*aaceae98SRobert Mustacchi (void) printf("]\n"); 1031*aaceae98SRobert Mustacchi } 1032*aaceae98SRobert Mustacchi 1033*aaceae98SRobert Mustacchi static bool 1034*aaceae98SRobert Mustacchi stdbit_test_one(const stdbit_test_t *test, const stdbit_ops_t *ops) 1035*aaceae98SRobert Mustacchi { 1036*aaceae98SRobert Mustacchi bool ret = true; 1037*aaceae98SRobert Mustacchi uint64_t comp = test->st_res; 1038*aaceae98SRobert Mustacchi 1039*aaceae98SRobert Mustacchi VERIFY3U(test->st_types, !=, 0); 1040*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U8) != 0) { 1041*aaceae98SRobert Mustacchi unsigned res = ops->so_uc(test->st_val); 1042*aaceae98SRobert Mustacchi if (res != comp) { 1043*aaceae98SRobert Mustacchi warnx("TEST FAILED: %s (0x%" PRIx64 ") 8-bit (uchar) " 1044*aaceae98SRobert Mustacchi "returned 0x%x, expected 0x%" PRIx64, 1045*aaceae98SRobert Mustacchi ops->so_name, test->st_val, res, comp); 1046*aaceae98SRobert Mustacchi ret = false; 1047*aaceae98SRobert Mustacchi } 1048*aaceae98SRobert Mustacchi 1049*aaceae98SRobert Mustacchi comp += ops->so_delta[0]; 1050*aaceae98SRobert Mustacchi } 1051*aaceae98SRobert Mustacchi 1052*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U16) != 0) { 1053*aaceae98SRobert Mustacchi unsigned res = ops->so_us(test->st_val); 1054*aaceae98SRobert Mustacchi if (res != comp) { 1055*aaceae98SRobert Mustacchi warnx("TEST FAILED: %s (0x%" PRIx64 ") 16-bit (ushort) " 1056*aaceae98SRobert Mustacchi "returned 0x%x, expected 0x%" PRIx64, 1057*aaceae98SRobert Mustacchi ops->so_name, test->st_val, res, comp); 1058*aaceae98SRobert Mustacchi ret = false; 1059*aaceae98SRobert Mustacchi } 1060*aaceae98SRobert Mustacchi 1061*aaceae98SRobert Mustacchi comp += ops->so_delta[1]; 1062*aaceae98SRobert Mustacchi } 1063*aaceae98SRobert Mustacchi 1064*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U32) != 0) { 1065*aaceae98SRobert Mustacchi unsigned res = ops->so_ui(test->st_val); 1066*aaceae98SRobert Mustacchi if (res != comp) { 1067*aaceae98SRobert Mustacchi warnx("TEST FAILED: %s (0x%" PRIx64 ") 32-bit (uint) " 1068*aaceae98SRobert Mustacchi "returned 0x%x, expected 0x%" PRIx64, 1069*aaceae98SRobert Mustacchi ops->so_name, test->st_val, res, comp); 1070*aaceae98SRobert Mustacchi ret = false; 1071*aaceae98SRobert Mustacchi } 1072*aaceae98SRobert Mustacchi 1073*aaceae98SRobert Mustacchi #ifdef _LP32 1074*aaceae98SRobert Mustacchi res = ops->so_ul(test->st_val); 1075*aaceae98SRobert Mustacchi if (res != comp) { 1076*aaceae98SRobert Mustacchi warnx("TEST FAILED: %s (0x%" PRIx64 ") 32-bit (ulong) " 1077*aaceae98SRobert Mustacchi "returned 0x%x, expected 0x%" PRIx64, 1078*aaceae98SRobert Mustacchi ops->so_name, test->st_val, res, comp); 1079*aaceae98SRobert Mustacchi ret = false; 1080*aaceae98SRobert Mustacchi } 1081*aaceae98SRobert Mustacchi #endif /* _LP32 */ 1082*aaceae98SRobert Mustacchi 1083*aaceae98SRobert Mustacchi comp += ops->so_delta[2]; 1084*aaceae98SRobert Mustacchi } 1085*aaceae98SRobert Mustacchi 1086*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U64) != 0) { 1087*aaceae98SRobert Mustacchi unsigned res; 1088*aaceae98SRobert Mustacchi #ifdef _LP64 1089*aaceae98SRobert Mustacchi res = ops->so_ul(test->st_val); 1090*aaceae98SRobert Mustacchi if (res != comp) { 1091*aaceae98SRobert Mustacchi warnx("TEST FAILED: %s (0x%" PRIx64 ") 64-bit (ulong) " 1092*aaceae98SRobert Mustacchi "returned 0x%x, expected 0x%" PRIx64, 1093*aaceae98SRobert Mustacchi ops->so_name, test->st_val, res, comp); 1094*aaceae98SRobert Mustacchi ret = false; 1095*aaceae98SRobert Mustacchi } 1096*aaceae98SRobert Mustacchi #endif /* _LP64 */ 1097*aaceae98SRobert Mustacchi 1098*aaceae98SRobert Mustacchi res = ops->so_ull(test->st_val); 1099*aaceae98SRobert Mustacchi if (res != comp) { 1100*aaceae98SRobert Mustacchi warnx("TEST FAILED: %s (0x%" PRIx64 ") 64-bit (ulong " 1101*aaceae98SRobert Mustacchi "long) returned 0x%x, expected 0x%" PRIx64, 1102*aaceae98SRobert Mustacchi ops->so_name, test->st_val, res, comp); 1103*aaceae98SRobert Mustacchi ret = false; 1104*aaceae98SRobert Mustacchi } 1105*aaceae98SRobert Mustacchi } 1106*aaceae98SRobert Mustacchi 1107*aaceae98SRobert Mustacchi if (ret) { 1108*aaceae98SRobert Mustacchi stdbit_print_pass(test->st_types, test->st_val, ops->so_name); 1109*aaceae98SRobert Mustacchi } 1110*aaceae98SRobert Mustacchi 1111*aaceae98SRobert Mustacchi return (ret); 1112*aaceae98SRobert Mustacchi } 1113*aaceae98SRobert Mustacchi 1114*aaceae98SRobert Mustacchi /* 1115*aaceae98SRobert Mustacchi * This is used for all the functions that can return unsigned. 1116*aaceae98SRobert Mustacchi */ 1117*aaceae98SRobert Mustacchi typedef struct { 1118*aaceae98SRobert Mustacchi const stdbit_ops_t *sg_ops; 1119*aaceae98SRobert Mustacchi const stdbit_test_t *sg_tests; 1120*aaceae98SRobert Mustacchi size_t sg_ntests; 1121*aaceae98SRobert Mustacchi } stdbit_std_group_t; 1122*aaceae98SRobert Mustacchi 1123*aaceae98SRobert Mustacchi static const stdbit_std_group_t stdbit_groups[] = { 1124*aaceae98SRobert Mustacchi { &stdbit_clz_ops, stdbit_clz_tests, ARRAY_SIZE(stdbit_clz_tests) }, 1125*aaceae98SRobert Mustacchi { &stdbit_clo_ops, stdbit_clo_tests, ARRAY_SIZE(stdbit_clo_tests) }, 1126*aaceae98SRobert Mustacchi { &stdbit_ctz_ops, stdbit_ctz_tests, ARRAY_SIZE(stdbit_ctz_tests) }, 1127*aaceae98SRobert Mustacchi { &stdbit_cto_ops, stdbit_cto_tests, ARRAY_SIZE(stdbit_cto_tests) }, 1128*aaceae98SRobert Mustacchi { &stdbit_flz_ops, stdbit_flz_tests, ARRAY_SIZE(stdbit_flz_tests) }, 1129*aaceae98SRobert Mustacchi { &stdbit_flo_ops, stdbit_flo_tests, ARRAY_SIZE(stdbit_flo_tests) }, 1130*aaceae98SRobert Mustacchi { &stdbit_ftz_ops, stdbit_ftz_tests, ARRAY_SIZE(stdbit_ftz_tests) }, 1131*aaceae98SRobert Mustacchi { &stdbit_fto_ops, stdbit_fto_tests, ARRAY_SIZE(stdbit_fto_tests) }, 1132*aaceae98SRobert Mustacchi { &stdbit_cz_ops, stdbit_cz_tests, ARRAY_SIZE(stdbit_cz_tests) }, 1133*aaceae98SRobert Mustacchi { &stdbit_co_ops, stdbit_co_tests, ARRAY_SIZE(stdbit_co_tests) }, 1134*aaceae98SRobert Mustacchi { &stdbit_bw_ops, stdbit_bw_tests, ARRAY_SIZE(stdbit_bw_tests) }, 1135*aaceae98SRobert Mustacchi }; 1136*aaceae98SRobert Mustacchi 1137*aaceae98SRobert Mustacchi /* 1138*aaceae98SRobert Mustacchi * Tests for is a single bit set. These should be the same regardless of integer 1139*aaceae98SRobert Mustacchi * size. 1140*aaceae98SRobert Mustacchi */ 1141*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_1b_tests[] = { { 1142*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 1143*aaceae98SRobert Mustacchi .st_val = 0, 1144*aaceae98SRobert Mustacchi .st_res = false 1145*aaceae98SRobert Mustacchi }, { 1146*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 1147*aaceae98SRobert Mustacchi .st_val = UINT8_MAX, 1148*aaceae98SRobert Mustacchi .st_res = false 1149*aaceae98SRobert Mustacchi }, { 1150*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 1151*aaceae98SRobert Mustacchi .st_val = 0x40, 1152*aaceae98SRobert Mustacchi .st_res = true 1153*aaceae98SRobert Mustacchi }, { 1154*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 1155*aaceae98SRobert Mustacchi .st_val = 0x23, 1156*aaceae98SRobert Mustacchi .st_res = false 1157*aaceae98SRobert Mustacchi }, { 1158*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 1159*aaceae98SRobert Mustacchi .st_val = 0x81, 1160*aaceae98SRobert Mustacchi .st_res = false 1161*aaceae98SRobert Mustacchi }, { 1162*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_ALL, 1163*aaceae98SRobert Mustacchi .st_val = 0x08, 1164*aaceae98SRobert Mustacchi .st_res = true 1165*aaceae98SRobert Mustacchi }, { 1166*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 1167*aaceae98SRobert Mustacchi .st_val = UINT16_MAX, 1168*aaceae98SRobert Mustacchi .st_res = false 1169*aaceae98SRobert Mustacchi }, { 1170*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 1171*aaceae98SRobert Mustacchi .st_val = 0x0100, 1172*aaceae98SRobert Mustacchi .st_res = true 1173*aaceae98SRobert Mustacchi }, { 1174*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 1175*aaceae98SRobert Mustacchi .st_val = 0x7777, 1176*aaceae98SRobert Mustacchi .st_res = false 1177*aaceae98SRobert Mustacchi }, { 1178*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 1179*aaceae98SRobert Mustacchi .st_val = 0x8000, 1180*aaceae98SRobert Mustacchi .st_res = true 1181*aaceae98SRobert Mustacchi }, { 1182*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 1183*aaceae98SRobert Mustacchi .st_val = 0x0400, 1184*aaceae98SRobert Mustacchi .st_res = true 1185*aaceae98SRobert Mustacchi }, { 1186*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 1187*aaceae98SRobert Mustacchi .st_val = 0x0020, 1188*aaceae98SRobert Mustacchi .st_res = true 1189*aaceae98SRobert Mustacchi }, { 1190*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_16P, 1191*aaceae98SRobert Mustacchi .st_val = 0x0001, 1192*aaceae98SRobert Mustacchi .st_res = true 1193*aaceae98SRobert Mustacchi }, { 1194*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 1195*aaceae98SRobert Mustacchi .st_val = UINT32_MAX, 1196*aaceae98SRobert Mustacchi .st_res = false 1197*aaceae98SRobert Mustacchi }, { 1198*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 1199*aaceae98SRobert Mustacchi .st_val = 0x00200000, 1200*aaceae98SRobert Mustacchi .st_res = true 1201*aaceae98SRobert Mustacchi }, { 1202*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 1203*aaceae98SRobert Mustacchi .st_val = 0xbaddcafe, 1204*aaceae98SRobert Mustacchi .st_res = false 1205*aaceae98SRobert Mustacchi }, { 1206*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_32P, 1207*aaceae98SRobert Mustacchi .st_val = 0x80000000, 1208*aaceae98SRobert Mustacchi .st_res = true 1209*aaceae98SRobert Mustacchi }, { 1210*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 1211*aaceae98SRobert Mustacchi .st_val = UINT64_MAX, 1212*aaceae98SRobert Mustacchi .st_res = false 1213*aaceae98SRobert Mustacchi }, { 1214*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 1215*aaceae98SRobert Mustacchi .st_val = 0x8000000000000000, 1216*aaceae98SRobert Mustacchi .st_res = true 1217*aaceae98SRobert Mustacchi }, { 1218*aaceae98SRobert Mustacchi .st_types = STDBIT_TEST_64P, 1219*aaceae98SRobert Mustacchi .st_val = 0x0010000000000000, 1220*aaceae98SRobert Mustacchi .st_res = true 1221*aaceae98SRobert Mustacchi } }; 1222*aaceae98SRobert Mustacchi 1223*aaceae98SRobert Mustacchi /* 1224*aaceae98SRobert Mustacchi * The single bit set tests require a slightly different runner because they 1225*aaceae98SRobert Mustacchi * return a boolean. 1226*aaceae98SRobert Mustacchi */ 1227*aaceae98SRobert Mustacchi static bool 1228*aaceae98SRobert Mustacchi stdbit_1b_test_one(const stdbit_test_t *test) 1229*aaceae98SRobert Mustacchi { 1230*aaceae98SRobert Mustacchi bool ret = true, comp; 1231*aaceae98SRobert Mustacchi 1232*aaceae98SRobert Mustacchi VERIFY(test->st_res == 0 || test->st_res == 1); 1233*aaceae98SRobert Mustacchi comp = (bool)test->st_res; 1234*aaceae98SRobert Mustacchi 1235*aaceae98SRobert Mustacchi VERIFY3U(test->st_types, !=, 0); 1236*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U8) != 0) { 1237*aaceae98SRobert Mustacchi bool res = stdc_has_single_bit_uc(test->st_val); 1238*aaceae98SRobert Mustacchi if (res != comp) { 1239*aaceae98SRobert Mustacchi warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 8-bit " 1240*aaceae98SRobert Mustacchi "(uchar) returned %s, expected %s", test->st_val, 1241*aaceae98SRobert Mustacchi res ? "true" : "false", comp ? "true" : "false"); 1242*aaceae98SRobert Mustacchi ret = false; 1243*aaceae98SRobert Mustacchi } 1244*aaceae98SRobert Mustacchi } 1245*aaceae98SRobert Mustacchi 1246*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U16) != 0) { 1247*aaceae98SRobert Mustacchi bool res = stdc_has_single_bit_us(test->st_val); 1248*aaceae98SRobert Mustacchi if (res != comp) { 1249*aaceae98SRobert Mustacchi warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 16-bit " 1250*aaceae98SRobert Mustacchi "(ushort) returned %s, expected %s", test->st_val, 1251*aaceae98SRobert Mustacchi res ? "true" : "false", comp ? "true" : "false"); 1252*aaceae98SRobert Mustacchi ret = false; 1253*aaceae98SRobert Mustacchi } 1254*aaceae98SRobert Mustacchi } 1255*aaceae98SRobert Mustacchi 1256*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U32) != 0) { 1257*aaceae98SRobert Mustacchi bool res = stdc_has_single_bit_ui(test->st_val); 1258*aaceae98SRobert Mustacchi if (res != comp) { 1259*aaceae98SRobert Mustacchi warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 32-bit " 1260*aaceae98SRobert Mustacchi "(uint) returned %s, expected %s", test->st_val, 1261*aaceae98SRobert Mustacchi res ? "true" : "false", comp ? "true" : "false"); 1262*aaceae98SRobert Mustacchi ret = false; 1263*aaceae98SRobert Mustacchi } 1264*aaceae98SRobert Mustacchi 1265*aaceae98SRobert Mustacchi #ifdef _LP32 1266*aaceae98SRobert Mustacchi res = stdc_has_single_bit_ul(test->st_val); 1267*aaceae98SRobert Mustacchi if (res != comp) { 1268*aaceae98SRobert Mustacchi warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 32-bit " 1269*aaceae98SRobert Mustacchi "(ulong) returned %s, expected %s", test->st_val, 1270*aaceae98SRobert Mustacchi res ? "true" : "false", comp ? "true" : "false"); 1271*aaceae98SRobert Mustacchi ret = false; 1272*aaceae98SRobert Mustacchi } 1273*aaceae98SRobert Mustacchi #endif /* _LP32 */ 1274*aaceae98SRobert Mustacchi } 1275*aaceae98SRobert Mustacchi 1276*aaceae98SRobert Mustacchi if ((test->st_types & STDBIT_TEST_U64) != 0) { 1277*aaceae98SRobert Mustacchi bool res; 1278*aaceae98SRobert Mustacchi #ifdef _LP64 1279*aaceae98SRobert Mustacchi res = stdc_has_single_bit_ul(test->st_val); 1280*aaceae98SRobert Mustacchi if (res != comp) { 1281*aaceae98SRobert Mustacchi warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 64-bit " 1282*aaceae98SRobert Mustacchi "(ulong) returned %s, expected %s", test->st_val, 1283*aaceae98SRobert Mustacchi res ? "true" : "false", comp ? "true" : "false"); 1284*aaceae98SRobert Mustacchi ret = false; 1285*aaceae98SRobert Mustacchi } 1286*aaceae98SRobert Mustacchi #endif /* _LP64 */ 1287*aaceae98SRobert Mustacchi 1288*aaceae98SRobert Mustacchi res = stdc_has_single_bit_ull(test->st_val); 1289*aaceae98SRobert Mustacchi if (res != comp) { 1290*aaceae98SRobert Mustacchi warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 64-bit " 1291*aaceae98SRobert Mustacchi "(ulong long) returned %s, expected %s", 1292*aaceae98SRobert Mustacchi test->st_val, res ? "true" : "false", 1293*aaceae98SRobert Mustacchi comp ? "true" : "false"); 1294*aaceae98SRobert Mustacchi ret = false; 1295*aaceae98SRobert Mustacchi } 1296*aaceae98SRobert Mustacchi } 1297*aaceae98SRobert Mustacchi 1298*aaceae98SRobert Mustacchi if (ret) { 1299*aaceae98SRobert Mustacchi stdbit_print_pass(test->st_types, test->st_val, "Single-bit"); 1300*aaceae98SRobert Mustacchi } 1301*aaceae98SRobert Mustacchi 1302*aaceae98SRobert Mustacchi return (ret); 1303*aaceae98SRobert Mustacchi } 1304*aaceae98SRobert Mustacchi 1305*aaceae98SRobert Mustacchi /* 1306*aaceae98SRobert Mustacchi * We use a different test structure for the floor and ceiling tests and check 1307*aaceae98SRobert Mustacchi * both at each stop. 1308*aaceae98SRobert Mustacchi */ 1309*aaceae98SRobert Mustacchi typedef struct { 1310*aaceae98SRobert Mustacchi stdbit_test_type_t sfc_types; 1311*aaceae98SRobert Mustacchi uint64_t sfc_val; 1312*aaceae98SRobert Mustacchi uint64_t sfc_floor; 1313*aaceae98SRobert Mustacchi uint64_t sfc_ceil; 1314*aaceae98SRobert Mustacchi } stdbit_fc_test_t; 1315*aaceae98SRobert Mustacchi 1316*aaceae98SRobert Mustacchi /* 1317*aaceae98SRobert Mustacchi * Bit floor and ceiling tests. Note, a bit ceiling test can fail and return 0 1318*aaceae98SRobert Mustacchi * if the value would overlap the type it's in. In those cases we don't use all 1319*aaceae98SRobert Mustacchi * tests. This happens when the most significant bit in a given integer is set. 1320*aaceae98SRobert Mustacchi * It will work at the next size up. All others should always pass all tests. 1321*aaceae98SRobert Mustacchi */ 1322*aaceae98SRobert Mustacchi static const stdbit_fc_test_t stdbit_fc_tests[] = { { 1323*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_ALL, 1324*aaceae98SRobert Mustacchi .sfc_val = 0, 1325*aaceae98SRobert Mustacchi .sfc_floor = 0, 1326*aaceae98SRobert Mustacchi .sfc_ceil = 1 1327*aaceae98SRobert Mustacchi }, { 1328*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U8, 1329*aaceae98SRobert Mustacchi .sfc_val = UINT8_MAX, 1330*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 7, 1331*aaceae98SRobert Mustacchi .sfc_ceil = 0 1332*aaceae98SRobert Mustacchi }, { 1333*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_ALL, 1334*aaceae98SRobert Mustacchi .sfc_val = 0x23, 1335*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 5, 1336*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 6 1337*aaceae98SRobert Mustacchi }, { 1338*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_ALL, 1339*aaceae98SRobert Mustacchi .sfc_val = 0x06, 1340*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 2, 1341*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 3 1342*aaceae98SRobert Mustacchi }, { 1343*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_ALL, 1344*aaceae98SRobert Mustacchi .sfc_val = 0x18, 1345*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 4, 1346*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 5 1347*aaceae98SRobert Mustacchi }, { 1348*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U8, 1349*aaceae98SRobert Mustacchi .sfc_val = 0x81, 1350*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 7, 1351*aaceae98SRobert Mustacchi .sfc_ceil = 0 1352*aaceae98SRobert Mustacchi }, { 1353*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_16P, 1354*aaceae98SRobert Mustacchi .sfc_val = UINT8_MAX, 1355*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 7, 1356*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 8 1357*aaceae98SRobert Mustacchi }, { 1358*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_16P, 1359*aaceae98SRobert Mustacchi .sfc_val = 0x0ff7, 1360*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 11, 1361*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 12 1362*aaceae98SRobert Mustacchi }, { 1363*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_16P, 1364*aaceae98SRobert Mustacchi .sfc_val = 0x20a4, 1365*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 13, 1366*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 14 1367*aaceae98SRobert Mustacchi }, { 1368*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U16, 1369*aaceae98SRobert Mustacchi .sfc_val = 0x8ab1, 1370*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 15, 1371*aaceae98SRobert Mustacchi .sfc_ceil = 0 1372*aaceae98SRobert Mustacchi }, { 1373*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U16, 1374*aaceae98SRobert Mustacchi .sfc_val = UINT16_MAX, 1375*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 15, 1376*aaceae98SRobert Mustacchi .sfc_ceil = 0 1377*aaceae98SRobert Mustacchi }, { 1378*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_32P, 1379*aaceae98SRobert Mustacchi .sfc_val = UINT16_MAX, 1380*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 15, 1381*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 16 1382*aaceae98SRobert Mustacchi }, { 1383*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_32P, 1384*aaceae98SRobert Mustacchi .sfc_val = 0x000271ab, 1385*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 17, 1386*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 18 1387*aaceae98SRobert Mustacchi }, { 1388*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_32P, 1389*aaceae98SRobert Mustacchi .sfc_val = 0x01000009, 1390*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 24, 1391*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 25 1392*aaceae98SRobert Mustacchi }, { 1393*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_32P, 1394*aaceae98SRobert Mustacchi .sfc_val = 0x02000000, 1395*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 25, 1396*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 25 1397*aaceae98SRobert Mustacchi }, { 1398*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_32P, 1399*aaceae98SRobert Mustacchi .sfc_val = 0x1cabf917, 1400*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 28, 1401*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 29 1402*aaceae98SRobert Mustacchi }, { 1403*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U32, 1404*aaceae98SRobert Mustacchi .sfc_val = 0x800a9b03, 1405*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 31, 1406*aaceae98SRobert Mustacchi .sfc_ceil = 0 1407*aaceae98SRobert Mustacchi }, { 1408*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U32, 1409*aaceae98SRobert Mustacchi .sfc_val = UINT32_MAX, 1410*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 31, 1411*aaceae98SRobert Mustacchi .sfc_ceil = 0 1412*aaceae98SRobert Mustacchi }, { 1413*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_64P, 1414*aaceae98SRobert Mustacchi .sfc_val = UINT32_MAX, 1415*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 31, 1416*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 32 1417*aaceae98SRobert Mustacchi }, { 1418*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U64, 1419*aaceae98SRobert Mustacchi .sfc_val = 0x0089a23b1389ba87, 1420*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 55, 1421*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 56 1422*aaceae98SRobert Mustacchi }, { 1423*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U64, 1424*aaceae98SRobert Mustacchi .sfc_val = 0x499aff6eb12e7777, 1425*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 62, 1426*aaceae98SRobert Mustacchi .sfc_ceil = 1ULL << 63 1427*aaceae98SRobert Mustacchi }, { 1428*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U64, 1429*aaceae98SRobert Mustacchi .sfc_val = 0xc00123481980ab87, 1430*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 63, 1431*aaceae98SRobert Mustacchi .sfc_ceil = 0 1432*aaceae98SRobert Mustacchi }, { 1433*aaceae98SRobert Mustacchi .sfc_types = STDBIT_TEST_U64, 1434*aaceae98SRobert Mustacchi .sfc_val = UINT64_MAX, 1435*aaceae98SRobert Mustacchi .sfc_floor = 1ULL << 63, 1436*aaceae98SRobert Mustacchi .sfc_ceil = 0 1437*aaceae98SRobert Mustacchi } }; 1438*aaceae98SRobert Mustacchi 1439*aaceae98SRobert Mustacchi static bool 1440*aaceae98SRobert Mustacchi stdbit_fc_test_one(const stdbit_fc_test_t *test) 1441*aaceae98SRobert Mustacchi { 1442*aaceae98SRobert Mustacchi bool ret = true; 1443*aaceae98SRobert Mustacchi 1444*aaceae98SRobert Mustacchi VERIFY3U(test->sfc_types, !=, 0); 1445*aaceae98SRobert Mustacchi if ((test->sfc_types & STDBIT_TEST_U8) != 0) { 1446*aaceae98SRobert Mustacchi uint64_t res = stdc_bit_floor_uc(test->sfc_val); 1447*aaceae98SRobert Mustacchi if (res != test->sfc_floor) { 1448*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 8-bit " 1449*aaceae98SRobert Mustacchi "(uchar) returned 0x%" PRIx64 ", expected 0x%" 1450*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_floor); 1451*aaceae98SRobert Mustacchi ret = false; 1452*aaceae98SRobert Mustacchi } 1453*aaceae98SRobert Mustacchi 1454*aaceae98SRobert Mustacchi res = stdc_bit_ceil_uc(test->sfc_val); 1455*aaceae98SRobert Mustacchi if (res != test->sfc_ceil) { 1456*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 8-bit " 1457*aaceae98SRobert Mustacchi "(uchar) returned 0x%" PRIx64 ", expected 0x%" 1458*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_ceil); 1459*aaceae98SRobert Mustacchi ret = false; 1460*aaceae98SRobert Mustacchi } 1461*aaceae98SRobert Mustacchi } 1462*aaceae98SRobert Mustacchi 1463*aaceae98SRobert Mustacchi if ((test->sfc_types & STDBIT_TEST_U16) != 0) { 1464*aaceae98SRobert Mustacchi uint64_t res = stdc_bit_floor_us(test->sfc_val); 1465*aaceae98SRobert Mustacchi if (res != test->sfc_floor) { 1466*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 16-bit " 1467*aaceae98SRobert Mustacchi "(ushort) returned 0x%" PRIx64 ", expected 0x%" 1468*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_floor); 1469*aaceae98SRobert Mustacchi ret = false; 1470*aaceae98SRobert Mustacchi } 1471*aaceae98SRobert Mustacchi 1472*aaceae98SRobert Mustacchi res = stdc_bit_ceil_us(test->sfc_val); 1473*aaceae98SRobert Mustacchi if (res != test->sfc_ceil) { 1474*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 16-bit " 1475*aaceae98SRobert Mustacchi "(ushort) returned 0x%" PRIx64 ", expected 0x%" 1476*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_ceil); 1477*aaceae98SRobert Mustacchi ret = false; 1478*aaceae98SRobert Mustacchi } 1479*aaceae98SRobert Mustacchi } 1480*aaceae98SRobert Mustacchi 1481*aaceae98SRobert Mustacchi if ((test->sfc_types & STDBIT_TEST_U32) != 0) { 1482*aaceae98SRobert Mustacchi uint64_t res = stdc_bit_floor_ui(test->sfc_val); 1483*aaceae98SRobert Mustacchi if (res != test->sfc_floor) { 1484*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 32-bit " 1485*aaceae98SRobert Mustacchi "(uint) returned 0x%" PRIx64 ", expected 0x%" 1486*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_floor); 1487*aaceae98SRobert Mustacchi ret = false; 1488*aaceae98SRobert Mustacchi } 1489*aaceae98SRobert Mustacchi 1490*aaceae98SRobert Mustacchi res = stdc_bit_ceil_ui(test->sfc_val); 1491*aaceae98SRobert Mustacchi if (res != test->sfc_ceil) { 1492*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 32-bit " 1493*aaceae98SRobert Mustacchi "(uint) returned 0x%" PRIx64 ", expected 0x%" 1494*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_ceil); 1495*aaceae98SRobert Mustacchi ret = false; 1496*aaceae98SRobert Mustacchi } 1497*aaceae98SRobert Mustacchi 1498*aaceae98SRobert Mustacchi #ifdef _LP32 1499*aaceae98SRobert Mustacchi res = stdc_bit_floor_ul(test->sfc_val); 1500*aaceae98SRobert Mustacchi if (res != test->sfc_floor) { 1501*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 32-bit " 1502*aaceae98SRobert Mustacchi "(ulong) returned 0x%" PRIx64 ", expected 0x%" 1503*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_floor); 1504*aaceae98SRobert Mustacchi ret = false; 1505*aaceae98SRobert Mustacchi } 1506*aaceae98SRobert Mustacchi 1507*aaceae98SRobert Mustacchi res = stdc_bit_ceil_ul(test->sfc_val); 1508*aaceae98SRobert Mustacchi if (res != test->sfc_ceil) { 1509*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 32-bit " 1510*aaceae98SRobert Mustacchi "(ulong) returned 0x%" PRIx64 ", expected 0x%" 1511*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_ceil); 1512*aaceae98SRobert Mustacchi ret = false; 1513*aaceae98SRobert Mustacchi } 1514*aaceae98SRobert Mustacchi #endif /* _LP32 */ 1515*aaceae98SRobert Mustacchi } 1516*aaceae98SRobert Mustacchi 1517*aaceae98SRobert Mustacchi if ((test->sfc_types & STDBIT_TEST_U64) != 0) { 1518*aaceae98SRobert Mustacchi uint64_t res; 1519*aaceae98SRobert Mustacchi 1520*aaceae98SRobert Mustacchi #ifdef _LP64 1521*aaceae98SRobert Mustacchi res = stdc_bit_floor_ul(test->sfc_val); 1522*aaceae98SRobert Mustacchi if (res != test->sfc_floor) { 1523*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 64-bit " 1524*aaceae98SRobert Mustacchi "(ulong) returned 0x%" PRIx64 ", expected 0x%" 1525*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_floor); 1526*aaceae98SRobert Mustacchi ret = false; 1527*aaceae98SRobert Mustacchi } 1528*aaceae98SRobert Mustacchi 1529*aaceae98SRobert Mustacchi res = stdc_bit_ceil_ul(test->sfc_val); 1530*aaceae98SRobert Mustacchi if (res != test->sfc_ceil) { 1531*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 64-bit " 1532*aaceae98SRobert Mustacchi "(ulong) returned 0x%" PRIx64 ", expected 0x%" 1533*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_ceil); 1534*aaceae98SRobert Mustacchi ret = false; 1535*aaceae98SRobert Mustacchi } 1536*aaceae98SRobert Mustacchi #endif /* _LP64 */ 1537*aaceae98SRobert Mustacchi 1538*aaceae98SRobert Mustacchi res = stdc_bit_floor_ull(test->sfc_val); 1539*aaceae98SRobert Mustacchi if (res != test->sfc_floor) { 1540*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 64-bit " 1541*aaceae98SRobert Mustacchi "(ulong long) returned 0x%" PRIx64 ", expected 0x%" 1542*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_floor); 1543*aaceae98SRobert Mustacchi ret = false; 1544*aaceae98SRobert Mustacchi } 1545*aaceae98SRobert Mustacchi 1546*aaceae98SRobert Mustacchi res = stdc_bit_ceil_ull(test->sfc_val); 1547*aaceae98SRobert Mustacchi if (res != test->sfc_ceil) { 1548*aaceae98SRobert Mustacchi warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 64-bit " 1549*aaceae98SRobert Mustacchi "(ulong long) returned 0x%" PRIx64 ", expected 0x%" 1550*aaceae98SRobert Mustacchi PRIx64, test->sfc_val, res, test->sfc_ceil); 1551*aaceae98SRobert Mustacchi ret = false; 1552*aaceae98SRobert Mustacchi } 1553*aaceae98SRobert Mustacchi } 1554*aaceae98SRobert Mustacchi 1555*aaceae98SRobert Mustacchi if (ret) { 1556*aaceae98SRobert Mustacchi stdbit_print_pass(test->sfc_types, test->sfc_val, 1557*aaceae98SRobert Mustacchi "Bit Floor/Ceiling"); 1558*aaceae98SRobert Mustacchi } 1559*aaceae98SRobert Mustacchi 1560*aaceae98SRobert Mustacchi return (ret); 1561*aaceae98SRobert Mustacchi 1562*aaceae98SRobert Mustacchi } 1563*aaceae98SRobert Mustacchi 1564*aaceae98SRobert Mustacchi int 1565*aaceae98SRobert Mustacchi main(void) 1566*aaceae98SRobert Mustacchi { 1567*aaceae98SRobert Mustacchi int ret = EXIT_SUCCESS; 1568*aaceae98SRobert Mustacchi 1569*aaceae98SRobert Mustacchi for (size_t i = 0; i < ARRAY_SIZE(stdbit_groups); i++) { 1570*aaceae98SRobert Mustacchi for (size_t t = 0; t < stdbit_groups[i].sg_ntests; t++) { 1571*aaceae98SRobert Mustacchi if (!stdbit_test_one(&stdbit_groups[i].sg_tests[t], 1572*aaceae98SRobert Mustacchi stdbit_groups[i].sg_ops)) { 1573*aaceae98SRobert Mustacchi ret = EXIT_FAILURE; 1574*aaceae98SRobert Mustacchi } 1575*aaceae98SRobert Mustacchi } 1576*aaceae98SRobert Mustacchi } 1577*aaceae98SRobert Mustacchi 1578*aaceae98SRobert Mustacchi for (size_t i = 0; i < ARRAY_SIZE(stdbit_1b_tests); i++) { 1579*aaceae98SRobert Mustacchi if (!stdbit_1b_test_one(&stdbit_1b_tests[i])) { 1580*aaceae98SRobert Mustacchi ret = EXIT_FAILURE; 1581*aaceae98SRobert Mustacchi } 1582*aaceae98SRobert Mustacchi } 1583*aaceae98SRobert Mustacchi 1584*aaceae98SRobert Mustacchi for (size_t i = 0; i < ARRAY_SIZE(stdbit_fc_tests); i++) { 1585*aaceae98SRobert Mustacchi if (!stdbit_fc_test_one(&stdbit_fc_tests[i])) { 1586*aaceae98SRobert Mustacchi ret = EXIT_FAILURE; 1587*aaceae98SRobert Mustacchi } 1588*aaceae98SRobert Mustacchi } 1589*aaceae98SRobert Mustacchi 1590*aaceae98SRobert Mustacchi if (ret == EXIT_SUCCESS) { 1591*aaceae98SRobert Mustacchi (void) printf("All tests passed successfully\n"); 1592*aaceae98SRobert Mustacchi } 1593*aaceae98SRobert Mustacchi 1594*aaceae98SRobert Mustacchi return (ret); 1595*aaceae98SRobert Mustacchi } 1596