static inline int clz64(unsigned long val) { return val ? __builtin_clzll(val) : 64; } static inline int is_power_of_2(unsigned long value) { if (!value) return 0; return !(value & (value - 1)); } long pow2floor(long value) { if (!is_power_of_2(value)) value = 0x8000000000000000ULL >> clz64(value); return value; } unsigned foo(unsigned max, unsigned size) { if (size > max) size = max; size = pow2floor(size); 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; }