2020: update lib source files (trying to compile on 32 bits arch)

This commit is contained in:
2022-12-06 14:27:10 +01:00
parent f003511e10
commit b949e11314
6 changed files with 56 additions and 59 deletions

View File

@@ -10,8 +10,8 @@
* SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
*
*/
#ifndef BITS_H
#define BITS_H
#ifndef _BITS_H
#define _BITS_H
#include <stdint.h>
#include <stdbool.h>
@@ -49,6 +49,30 @@ typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;
/* count set bits: 10101000 -> 3
* ^ ^ ^
*/
static __always_inline int popcount64(u64 n)
{
# if __has_builtin(__builtin_popcountl)
# ifdef DEBUG_BITS
log_f(1, "builtin.\n");
# endif
return __builtin_popcountl(n);
# else
# ifdef DEBUG_BITS
log_f(1, "emulated.\n");
# endif
int count = 0;
while (n) {
count++;
n &= (n - 1);
}
return count;
# endif
}
/* char is a special case, as it can be signed or unsigned
*/
typedef signed char schar;
@@ -74,7 +98,7 @@ static __always_inline int ctz64(u64 n)
# ifdef DEBUG_BITS
log_f(1, "emulated.\n");
# endif
return popcount64((n & n) 1);
return popcount64((n & -n) - 1);
# endif
}
@@ -96,7 +120,7 @@ static __always_inline int ctz32(u32 n)
# ifdef DEBUG_BITS
log_f(1, "emulated.\n");
# endif
return popcount32((n & n) 1);
return popcount32((n & -n) - 1);
# endif
}
@@ -218,30 +242,6 @@ static __always_inline uint ffs32(u32 n)
# endif
}
/* count set bits: 10101000 -> 3
* ^ ^ ^
*/
static __always_inline int popcount64(u64 n)
{
# if __has_builtin(__builtin_popcountl)
# ifdef DEBUG_BITS
log_f(1, "builtin.\n");
# endif
return __builtin_popcountl(n);
# else
# ifdef DEBUG_BITS
log_f(1, "emulated.\n");
# endif
int count = 0;
while (n) {
count++;
n &= (n - 1);
}
return count;
# endif
}
static __always_inline int popcount32(u32 n)
{
# if __has_builtin(__builtin_popcount)
@@ -518,4 +518,4 @@ int __bits_per(unsigned long n)
#define bit_for_each32_2(pos, tmp, ul) \
for (tmp = ul, pos = ctz32(tmp); tmp; tmp ^= 1U << pos, pos = ctz32(tmp))
#endif /* BITS_H */
#endif /* _BITS_H */

View File

@@ -1,4 +1,4 @@
/* bits.h - bits functions.
/* br.h - misc macros.
*
* Copyright (C) 2021-2022 Bruno Raoult ("br")
* Licensed under the GNU General Public License v3.0 or later.
@@ -18,12 +18,18 @@
#ifndef _BR_H
#define _BR_H
/* Indirect stringification. Doing two levels allows the parameter to be a
* macro itself. For example, compile with -DFOO=bar, __stringify(FOO)
* converts to "bar".
*/
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
/* generate a (maybe) unique id.
*/
#define ___PASTE(x, y) x##y
#define __PASTE(x, y) ___PASTE(x, y)
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
//__##prefix##__COUNTER__
/* see https://lkml.org/lkml/2018/3/20/845 for explanation of this monster
*/