Annotation of sys/lib/libkern/ffs.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ffs.c,v 1.7 2004/11/28 07:23:41 mickey Exp $ */
! 2:
! 3: /*
! 4: * Public domain.
! 5: * Written by Dale Rahn.
! 6: */
! 7:
! 8: #if defined(LIBC_SCCS) && !defined(lint)
! 9: static char *rcsid = "$OpenBSD: ffs.c,v 1.7 2004/11/28 07:23:41 mickey Exp $";
! 10: #endif /* LIBC_SCCS and not lint */
! 11:
! 12: #if !defined(_KERNEL) && !defined(_STANDALONE)
! 13: #include <string.h>
! 14: #else
! 15: #include <lib/libkern/libkern.h>
! 16: #endif
! 17:
! 18: /*
! 19: * ffs -- vax ffs instruction
! 20: */
! 21: int
! 22: ffs(int mask)
! 23: {
! 24: int bit;
! 25: unsigned int r = mask;
! 26: static const signed char t[16] = {
! 27: -28, 1, 2, 1,
! 28: 3, 1, 2, 1,
! 29: 4, 1, 2, 1,
! 30: 3, 1, 2, 1
! 31: };
! 32:
! 33: bit = 0;
! 34: if (!(r & 0xffff)) {
! 35: bit += 16;
! 36: r >>= 16;
! 37: }
! 38: if (!(r & 0xff)) {
! 39: bit += 8;
! 40: r >>= 8;
! 41: }
! 42: if (!(r & 0xf)) {
! 43: bit += 4;
! 44: r >>= 4;
! 45: }
! 46:
! 47: return (bit + t[ r & 0xf ]);
! 48: }
CVSweb