Re: hex_to_bin speedup

From: George Spelvin
Date: Fri May 28 2010 - 17:38:32 EST


1) First of all, I'd worry about code size far more than speed.
this is not fast-path code.
2) Second, given that you're already doing a range test,
the fastest way to perform a tolower() is "c |= 0x20".

Generally it's something like:
int hex_to_bin(char ch)
{
ch -= '0';
if ((unsigned char)ch <= 9)
return ch;
ch |= 0x20;
ch -= 'a' - '0';
if ((unsigned char)ch <= 6)
return ch+10
return -1;
}


that produces the even smaller code:
hex_to_bin_or:
movb 4(%esp), %dl
subl $48, %edx
cmpb $9, %dl
movsbl %dl,%eax
jbe .L10
orl $32, %edx
orl $-1, %eax
subl $49, %edx
cmpb $6, %dl
ja .L10
movsbl %dl,%eax
addl $10, %eax
.L10:
ret

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/