Index: sys/dev/bhnd/bhndb/bhndb_private.h =================================================================== --- sys/dev/bhnd/bhndb/bhndb_private.h +++ sys/dev/bhnd/bhndb/bhndb_private.h @@ -189,6 +189,26 @@ return (br->dwa_freelist == 0); } +#define CTZ32_BSEARCH(x, n, MASK, SHIFT) if( (x & MASK) == 0){ x<<= SHIFT; n+= SHIFT; } +static inline int bhndb_ctz32(u_int32_t y){ +#if defined(__mips__) + int n = 0; + if(y == 0) return 32; + + int x = y; + + CTZ32_BSEARCH(x, n, 0x0000FFFF, 16); + CTZ32_BSEARCH(x, n, 0x000000FF, 8); + CTZ32_BSEARCH(x, n, 0x0000000F, 4); + CTZ32_BSEARCH(x, n, 0x00000003, 2); + CTZ32_BSEARCH(x, n, 0x00000001, 1); + + return n; +#else + return __builtin_ctz(y); +#endif +} + /** * Find the next free dynamic window region in @p br. * @@ -202,7 +222,7 @@ if (bhndb_dw_exhausted(br)) return (NULL); - dw_free = &br->dw_alloc[__builtin_ctz(br->dwa_freelist)]; + dw_free = &br->dw_alloc[bhndb_ctz32(br->dwa_freelist)]; KASSERT(LIST_EMPTY(&dw_free->refs), ("free list out of sync with refs")); Index: sys/dev/bhnd/bhndb/bhndb_subr.c =================================================================== --- sys/dev/bhnd/bhndb/bhndb_subr.c +++ sys/dev/bhnd/bhndb/bhndb_subr.c @@ -30,6 +30,7 @@ #include __FBSDID("$FreeBSD$"); +#include #include #include @@ -399,7 +400,7 @@ struct bhndb_dw_rentry *dwr, *dwr_next; /* No window regions may still be held */ - if (__builtin_popcount(br->dwa_freelist) != br->dwa_count) { + if (__bitcount32(br->dwa_freelist) != br->dwa_count) { device_printf(br->dev, "leaked %llu dynamic register regions\n", (unsigned long long) br->dwa_count - br->dwa_freelist); }