[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     ! 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