1 /* 2 * Copyright (C) 2011-2021 Free Software Foundation, Inc. 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16 17 /* Written by Eric Blake. */ 18 #include <config.h> 19 20 #include <string.h> 21 22 #include "signature.h" 23 SIGNATURE_CHECK (ffsll, int, (long long int)); 24 25 #include <limits.h> 26 27 #include "macros.h" 28 29 #define NBITS (sizeof (long long int) * CHAR_BIT) 30 31 static int naive(long long int i)32naive (long long int i) 33 { 34 unsigned long long int j; 35 for (j = 0; j < NBITS; j++) 36 if (i & (1ULL << j)) 37 return j + 1; 38 return 0; 39 } 40 41 int main(int argc,char * argv[])42main (int argc, char *argv[]) 43 { 44 long long int x; 45 int i; 46 47 for (x = -128; x <= 128; x++) 48 ASSERT (ffsll (x) == naive (x)); 49 for (i = 0; i < NBITS; i++) 50 { 51 ASSERT (ffsll (1ULL << i) == naive (1ULL << i)); 52 ASSERT (ffsll (1ULL << i) == i + 1); 53 ASSERT (ffsll (-1ULL << i) == i + 1); 54 } 55 for (i = 0; i < NBITS - 1; i++) 56 { 57 ASSERT (ffsll (3ULL << i) == i + 1); 58 ASSERT (ffsll (-3ULL << i) == i + 1); 59 } 60 for (i = 0; i < NBITS - 2; i++) 61 { 62 ASSERT (ffsll (5ULL << i) == i + 1); 63 ASSERT (ffsll (-5ULL << i) == i + 1); 64 ASSERT (ffsll (7ULL << i) == i + 1); 65 ASSERT (ffsll (-7ULL << i) == i + 1); 66 } 67 return 0; 68 } 69