root/sys/lib/libkern/ffs.c
/*      $OpenBSD: ffs.c,v 1.9 2014/06/10 04:16:57 deraadt Exp $ */

/*
 * Public domain.
 * Written by Dale Rahn.
 */

#include <lib/libkern/libkern.h>

/*
 * 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 ]);
}