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 Colombierispow2(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 Colombierisulpow2(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 Colombierlog2(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