/* $OpenBSD: ffs.c,v 1.8 2009/10/27 23:59:35 deraadt Exp $ */ /* * Public domain. * Written by Dale Rahn. */ #if !defined(_KERNEL) && !defined(_STANDALONE) #include #else #include #endif /* * ffs -- vax ffs instruction */ int ffs(int mask) { int bit; unsigned int r = mask; static const signed char t[16] = { -28, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1 }; bit = 0; if (!(r & 0xffff)) { bit += 16; r >>= 16; } if (!(r & 0xff)) { bit += 8; r >>= 8; } if (!(r & 0xf)) { bit += 4; r >>= 4; } return (bit + t[ r & 0xf ]); }