static inline int clz32(unsigned long val) { return val ? __builtin_clz(val) : 32; } int fls(int value) { return 32 - clz32(value); } unsigned foo(unsigned max, unsigned size) { if (size > max) size = max; if (size & (size - 1)) size = 1 << (fls(size) - 1); return size; } int main(void) { unsigned i, l, max; volatile val; for (i = 0; i < 100000000; i++) { for (max = 1; max <= 8; max <<= 1) { for (l = 1; l <= 8; l++) val = foo(max, l); } } return 0; }