https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61520
--- Comment #1 from Sergei Golubchik <vuvova at gmail dot com> --- A slightly modified version: static const int powers10[]= { 0, 1, 10, 100 }; int remove_leading_zeroes(unsigned int decimals, unsigned int var) { decimals%= 2; while (var < powers10[decimals--]) ; return decimals; } assembly: remove_leading_zeroes: andl $1, %edi movl %edi, %edx leal -1(%rdi), %eax cmpl powers10(,%rdx,4), %esi jae .L2 movl %eax, %ecx leal -2(%rdi), %edx cmpl powers10(,%rcx,4), %esi movl %edx, %eax jae .L2 leal -3(%rdi), %eax subl $4, %edi cmpl powers10(,%rdx,4), %esi cmovb %edi, %eax .L2: rep ret