/*
 * $OpenBSD: ffs.c,v 1.7 2005/08/08 08:05:37 espie Exp $
 */

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

#include "ffs.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]);
}
