2.11BSD/src/lib/libc/pdp/gen/ffs.s
/*
* Copyright (c) 1987 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifdef LIBC_SCCS
<@(#)ffs.s 1.2 (Berkeley) 1/8/87\0>
.even
#endif LIBC_SCCS
#include "DEFS.h"
/*
* ffs(mask)
* long mask;
*
* Return index of lowest order bit set in mask (counting from the right
* starting at 1), or zero if mask is zero. Ffs(m) is essentiallty
* log2(m)+1 with a 0 error return.
*/
ENTRY(ffs)
clr r0 / cnt:r0 = 0
mov 4(sp),r1 / if ((imask = loint(mask)) != 0)
bne 1f
mov 2(sp),r1 / if ((imask = hiint(mask)) == 0)
beq 2f
mov $16.,r0 / else cnt = 16
1:
inc r0 / do { cnt++
asr r1 / imask >>= 1
bcc 1b / } while (!wasodd(imask))
2:
rts pc / return(cnt:r0)