1*49390697SRobert Clausecker /*- 2*49390697SRobert Clausecker * Copyright (c) 2023 The FreeBSD Foundation 3*49390697SRobert Clausecker * 4*49390697SRobert Clausecker * This software was developed by Robert Clausecker <fuz@FreeBSD.org> 5*49390697SRobert Clausecker * under sponsorship from the FreeBSD Foundation. 6*49390697SRobert Clausecker * 7*49390697SRobert Clausecker * Redistribution and use in source and binary forms, with or without 8*49390697SRobert Clausecker * modification, are permitted provided that the following conditions 9*49390697SRobert Clausecker * are met: 10*49390697SRobert Clausecker * 1. Redistributions of source code must retain the above copyright 11*49390697SRobert Clausecker * notice, this list of conditions and the following disclaimer. 12*49390697SRobert Clausecker * 2. Redistributions in binary form must reproduce the above copyright 13*49390697SRobert Clausecker * notice, this list of conditions and the following disclaimer in the 14*49390697SRobert Clausecker * documentation and/or other materials provided with the distribution. 15*49390697SRobert Clausecker * 16*49390697SRobert Clausecker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ''AS IS'' AND 17*49390697SRobert Clausecker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*49390697SRobert Clausecker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*49390697SRobert Clausecker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*49390697SRobert Clausecker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*49390697SRobert Clausecker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*49390697SRobert Clausecker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*49390697SRobert Clausecker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*49390697SRobert Clausecker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*49390697SRobert Clausecker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*49390697SRobert Clausecker * SUCH DAMAGE 27*49390697SRobert Clausecker */ 28*49390697SRobert Clausecker #include <sys/cdefs.h> 29*49390697SRobert Clausecker 30*49390697SRobert Clausecker #include <atf-c.h> 31*49390697SRobert Clausecker #include <limits.h> 32*49390697SRobert Clausecker #include <stdint.h> 33*49390697SRobert Clausecker #include <strings.h> 34*49390697SRobert Clausecker 35*49390697SRobert Clausecker #ifndef FLS 36*49390697SRobert Clausecker # define FLS fls 37*49390697SRobert Clausecker # define TYPE int 38*49390697SRobert Clausecker # define TYPE_MIN INT_MIN 39*49390697SRobert Clausecker #endif 40*49390697SRobert Clausecker 41*49390697SRobert Clausecker ATF_TC_WITHOUT_HEAD(zero); 42*49390697SRobert Clausecker ATF_TC_BODY(zero, tc) 43*49390697SRobert Clausecker { 44*49390697SRobert Clausecker ATF_CHECK_EQ((TYPE)0, FLS(0)); 45*49390697SRobert Clausecker } 46*49390697SRobert Clausecker 47*49390697SRobert Clausecker ATF_TC_WITHOUT_HEAD(twobit); 48*49390697SRobert Clausecker ATF_TC_BODY(twobit, tc) 49*49390697SRobert Clausecker { 50*49390697SRobert Clausecker const TYPE one = 1; 51*49390697SRobert Clausecker TYPE x; 52*49390697SRobert Clausecker const int n = sizeof(TYPE) * CHAR_BIT; 53*49390697SRobert Clausecker int i, j; 54*49390697SRobert Clausecker 55*49390697SRobert Clausecker for (i = 0; i < n - 1; i++) 56*49390697SRobert Clausecker for (j = 0; j <= i; j++) { 57*49390697SRobert Clausecker x = one << i | one << j; 58*49390697SRobert Clausecker ATF_CHECK_EQ_MSG(i + 1, FLS(x), 59*49390697SRobert Clausecker "%s(%#jx) == %d != %d", __STRING(FLS), (intmax_t)x, FLS(x), i + 1); 60*49390697SRobert Clausecker } 61*49390697SRobert Clausecker } 62*49390697SRobert Clausecker 63*49390697SRobert Clausecker ATF_TC_WITHOUT_HEAD(twobitneg); 64*49390697SRobert Clausecker ATF_TC_BODY(twobitneg, tc) 65*49390697SRobert Clausecker { 66*49390697SRobert Clausecker const TYPE one = 1; 67*49390697SRobert Clausecker TYPE x; 68*49390697SRobert Clausecker const int n = sizeof(TYPE) * CHAR_BIT; 69*49390697SRobert Clausecker int i, j; 70*49390697SRobert Clausecker 71*49390697SRobert Clausecker for (i = 0; i < n - 1; i++) 72*49390697SRobert Clausecker for (j = 0; j <= i; j++) { 73*49390697SRobert Clausecker x = one << i | one << j | TYPE_MIN; 74*49390697SRobert Clausecker ATF_CHECK_EQ_MSG(n, FLS(x), 75*49390697SRobert Clausecker "%s(%#jx) == %d != %d", __STRING(FLS), (intmax_t)x, FLS(x), n); 76*49390697SRobert Clausecker } 77*49390697SRobert Clausecker } 78*49390697SRobert Clausecker 79*49390697SRobert Clausecker 80*49390697SRobert Clausecker ATF_TP_ADD_TCS(tp) 81*49390697SRobert Clausecker { 82*49390697SRobert Clausecker 83*49390697SRobert Clausecker ATF_TP_ADD_TC(tp, zero); 84*49390697SRobert Clausecker ATF_TP_ADD_TC(tp, twobit); 85*49390697SRobert Clausecker ATF_TP_ADD_TC(tp, twobitneg); 86*49390697SRobert Clausecker 87*49390697SRobert Clausecker return (atf_no_error()); 88*49390697SRobert Clausecker } 89