static inline int foo (long x) { register int a = 0; register unsigned b; do { b = (x & 0x7f); x = (x >> 7) | ~(-1L >> 7); a += 1; } while ((x != 0 || (b & 0x40) != 0) && (x != -1 || (b & 0x40) == 0)); return a; } static inline int bar (unsigned long x) { register int a = 0; register unsigned b; do { b = (x & 0x7f); x >>= 7; a++; } while (x != 0); return a; } int baz (unsigned long x, int y) { if (y) return foo ((long) x); else return bar (x); }