xref: /plan9-contrib/sys/src/9/port/logpow.c (revision 22402af72e824b13a03306b380e882c0b67c2e73)
1*22402af7SDavid du Colombier /*
2*22402af7SDavid du Colombier  * log2 and pow2 routines.
3*22402af7SDavid du Colombier  */
4*22402af7SDavid du Colombier #include "u.h"
5*22402af7SDavid du Colombier #include "../port/lib.h"
6*22402af7SDavid du Colombier #include "mem.h"
7*22402af7SDavid du Colombier #include "dat.h"
8*22402af7SDavid du Colombier #include "fns.h"
9*22402af7SDavid du Colombier 
10*22402af7SDavid du Colombier /*
11*22402af7SDavid du Colombier  * these routines should be cheap enough that there will
12*22402af7SDavid du Colombier  * be no hesitation to use them.
13*22402af7SDavid du Colombier  *
14*22402af7SDavid du Colombier  * once 5c in-lines vlong ops, just use the vlong versions.
15*22402af7SDavid du Colombier  */
16*22402af7SDavid du Colombier 
17*22402af7SDavid du Colombier int
ispow2(uvlong uvl)18*22402af7SDavid du Colombier ispow2(uvlong uvl)
19*22402af7SDavid du Colombier {
20*22402af7SDavid du Colombier 	return ISPOW2(uvl);
21*22402af7SDavid du Colombier }
22*22402af7SDavid du Colombier 
23*22402af7SDavid du Colombier static int
isulpow2(ulong ul)24*22402af7SDavid du Colombier isulpow2(ulong ul)				/* temporary speed hack */
25*22402af7SDavid du Colombier {
26*22402af7SDavid du Colombier 	return ISPOW2(ul);
27*22402af7SDavid du Colombier }
28*22402af7SDavid du Colombier 
29*22402af7SDavid du Colombier /*
30*22402af7SDavid du Colombier  * return exponent of smallest power of 2 ≥ n
31*22402af7SDavid du Colombier  */
32*22402af7SDavid du Colombier int
log2(ulong n)33*22402af7SDavid du Colombier log2(ulong n)
34*22402af7SDavid du Colombier {
35*22402af7SDavid du Colombier 	int i;
36*22402af7SDavid du Colombier 
37*22402af7SDavid du Colombier 	i = BI2BY*BY2WD - 1 - clz(n);
38*22402af7SDavid du Colombier 	if (n == 0 || !ISPOW2(n))
39*22402af7SDavid du Colombier 		i++;
40*22402af7SDavid du Colombier 	return i;
41*22402af7SDavid du Colombier }
42