Browse Source

new version of ffs from drahn@

combines binary search and table lookup.
tested on i386, sparc, ppc, hppa
OPENBSD_2_8
mickey 24 years ago
parent
commit
3c9d5e13a7
1 changed files with 28 additions and 38 deletions
  1. +28
    -38
      src/lib/libc/string/ffs.c

+ 28
- 38
src/lib/libc/string/ffs.c View File

@ -1,41 +1,15 @@
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
/* $OpenBSD: ffs.c,v 1.4 2000/07/02 01:00:01 mickey Exp $ */
/*
* Public domain.
* Written by Dale Rahn.
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static char *rcsid = "$OpenBSD: ffs.c,v 1.3 1996/08/19 08:34:01 tholo Exp $";
static char *rcsid = "$OpenBSD: ffs.c,v 1.4 2000/07/02 01:00:01 mickey Exp $";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#ifndef _KERNEL
#if !defined(_KERNEL) && !defined(_STANDALONE)
#include <string.h> #include <string.h>
#else #else
#include <lib/libkern/libkern.h> #include <lib/libkern/libkern.h>
@ -49,10 +23,26 @@ ffs(mask)
register int mask; register int mask;
{ {
register int bit; register int bit;
register 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 (0 == (r & 0xffff)) {
bit += 16;
r >>= 16;
}
if (0 == (r & 0xff)) {
bit += 8;
r >>= 8;
}
if (0 == (r & 0xf)) {
bit += 4;
r >>= 4;
}
if (mask == 0)
return(0);
for (bit = 1; !(mask & 1); bit++)
mask >>= 1;
return(bit);
return (bit + t[ r & 0xf ]);
} }

Loading…
Cancel
Save