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