root/lib/libkern/ffs.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ffs

    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 }

/* [<][>][^][v][top][bottom][index][help] */