Re: [PATCH v2] x86/lib: Optimize num_digits() and fix INT_MIN overflow

From: H. Peter Anvin

Date: Tue Jan 20 2026 - 18:49:47 EST


On 2026-01-20 15:32, David Desobry wrote:
>
> Good catch. I have replaced the switch statement with a linear if-chain in v3
> to ensure better code generation for both GCC and Clang.
>

I think a bigger deal is just to change it to unsigned.

Now, for really silly optimization:

int num_digits(unsigned int x)
{
int n = 0;
asm("cmp %2,%1; sbb $-2,%0" : "+r" (n) : "r" (x), "g" (10));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (100));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (1000));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (10000));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (100000));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (1000000));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (10000000));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (100000000));
asm("cmp %2,%1; sbb $-1,%0" : "+r" (n) : "r" (x), "g" (1000000000));

return n;
}

No branches at all!

-hpa