[BACK]Return to ffs.c CVS log [TXT][DIR] Up to [local] / sys / lib / libkern

Annotation of sys/lib/libkern/ffs.c, Revision 1.1.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