make isdigit() table lookupless
PATCH 1/1 make isdigit() table lookupless
Make isdigit into a simple range checking inline function:
return '0' <= c && c <= '9';
This code is 1 branch, not 2 because any reasonable compiler can optimize this code into SUB+CMP, so the code
while (isdigit((c = *s++))) ...
remains 1 branch per iteration HOWEVER it suddenly doesn't do table lookup priming cacheline nobody cares about.
Signed-off-by Alexey Dobriyan <[email protected]>
---
include/linux/ctype.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
include/linux/ctype.h +4 -1
@@ -22,7 +22,10 @@ extern const unsigned char _ctype[];#define isalnum (c) ((__ismask(c)&(_U|_L|_D)) != 0)#define isalpha (c) ((__ismask(c)&(_U|_L)) != 0)#define iscntrl (c) ((__ismask(c)&(_C)) != 0) -#define isdigit (c) ((__ismask(c)&(_D)) != 0) +static inline int isdigit (int c) +{ +return '0' <= c && c <='9' ; +}#define isgraph (c) ((__ismask(c)&(_P|_U|_L|_D)) != 0)#define islower (c) ((__ismask(c)&(_L)) != 0)#define isprint (c) ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)