/* $OpenBSD: ffs.c,v 1.7 2005/08/08 08:05:37 espie Exp $ */ | |
/* | |
* Public domain. | |
* Written by Dale Rahn. | |
*/ | |
/* | |
* 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 ]); | |
} |