From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752365AbcF3VSi (ORCPT ); Thu, 30 Jun 2016 17:18:38 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:33764 "EHLO mail-wm0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751651AbcF3VSg convert rfc822-to-8bit (ORCPT ); Thu, 30 Jun 2016 17:18:36 -0400 From: Michal Nazarewicz To: Joe Perches , Andy Shevchenko , zengzhaoxiu@163.com, linux-kernel@vger.kernel.org Cc: Zhaoxiu Zeng , Andrew Morton , Hidehiro Kawai , Borislav Petkov , Michal Hocko , Rasmus Villemoes , Nicolas Iooss , "Steven Rostedt \(Red Hat\)" , Gustavo Padovan , Geert Uytterhoeven , Horacio Mijail Anton Quiles Subject: Re: [PATCH 1/2] lib: hexdump: use a look-up table to do hex_to_bin In-Reply-To: <1467314771.24287.160.camel@perches.com> Organization: http://mina86.com/ References: <1467216957-58885-1-git-send-email-zengzhaoxiu@163.com> <1467226354.30123.336.camel@linux.intel.com> <1467314771.24287.160.camel@perches.com> User-Agent: Notmuch/0.19+53~g2e63a09 (http://notmuchmail.org) Emacs/25.1.50.1 (x86_64-unknown-linux-gnu) Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAJFBMVEWbfGlUPDDHgE57V0jUupKjgIObY0PLrom9mH4dFRK4gmjPs41MxjOgAAACP0lEQVQ4T23Sv2vbQBQHcBk1xE6WyALX107VUEgmn6+ouUwpEQQ6uRjttkWP4CkBg2M0BQLBdPFZYPsyFYo7qEtKDQ7on+t7+nF2Ux8ahD587717OmNYrOvycHsZ+o2r051wHTHysAvGb8ygvgu4QWT0sCmkgZCIEnlV2X8BtyraazFGDuxhmKSQJMlwHQ7v5MHSNxmz78rfElwAa3ieVD9e+hBhjaPDDG6NgFo2f4wBMNIo5YmRtF0RyDgFjJjlMIWbnuM4x9MMfABGTlN4qgIQB4A1DEyA1BHWtfeWNUMwiVJKoqh97KrkOO+qzgluVYLvFCUKAX73nONeBr7BGMdM6Sg0kuep03VywLaIzRiVr+GAzKlpQIsAFnWAG2e6DT5WmWDiudZMIc6hYrMOmeMQK9WX0B+/RfjzL9DI7Y9/Iayn29Ci0r2i4f9gMimMSZLCDMalgQGU5hnUtqAN0OGvEmO1Wnl0C0wWSCEHnuHBqmygxdxA8oWXwbipoc1EoNR9DqOpBpOJrnr0criQab9ZT4LL+wI+K7GBQH30CrhUruilgP9DRTrhVWZCiAyILP+wiuLeCKGTD6r/nc8LOJcAwR6IBTUs+7CASw3QFZ0MdA2PI3zNziH4ZKVhXCRMBjeZ1DWMekKwDCASwExy+NQ86TaykaDAFHO4aP48y4fIcDM5yOG8GcTLbOyp8A8azjJI93JFd1EA6yN8sSxMQJWoABqniRZVykYgRXErzrdqExAoUrRb0xfRp8p2A/4XmfilTtkDZ4cAAAAASUVORK5CYII= X-Face: -TR8(rDTHy/(xl?SfWd1|3:TTgDIatE^t'vop%*gVg[kn$t{EpK(P"VQ=~T2#ysNmJKN$"yTRLB4YQs$4{[.]Fc1)*O]3+XO^oXM>Q#b^ix,O)Zbn)q[y06$`e3?C)`CwR9y5riE=fv^X@x$y?D:XO6L&x4f-}}I4=VRNwiA^t1-ZrVK^07.Pi/57c_du'& X-PGP: 50751FF4 X-PGP-FP: AC1F 5F5C D418 88F8 CC84 5858 2060 4012 5075 1FF4 X-Hashcash: 1:20:160630:zhaoxiu.zeng@gmail.com::SRHtoGOu5nYZOKMA:0000000000000000000000000000000000000000qce X-Hashcash: 1:20:160630:joe@perches.com::bA4E39E4mGbBGAky:000nGK X-Hashcash: 1:20:160630:bp@suse.de::Gd9EQWcccp9erEO9:00000001CWA X-Hashcash: 1:20:160630:zengzhaoxiu@163.com::sswct6SqiXqRyB7a:0000000000000000000000000000000000000000001ROv X-Hashcash: 1:20:160630:rostedt@goodmis.org::Qop9ao/Uhf5i5p9q:0000000000000000000000000000000000000000001yOV X-Hashcash: 1:20:160630:nicolas.iooss_linux@m4x.org::hVW1j7GRmEX2jKm4:00000000000000000000000000000000001hM+ X-Hashcash: 1:20:160630:andriy.shevchenko@linux.intel.com::iwHGRYCPxXDuZYA8:00000000000000000000000000001foa X-Hashcash: 1:20:160630:linux-kernel@vger.kernel.org::uDPw/OvebUEINKUy:0000000000000000000000000000000002EVp X-Hashcash: 1:20:160630:hidehiro.kawai.ez@hitachi.com::a4Uck8UGFZ5+sChh:000000000000000000000000000000003XNy X-Hashcash: 1:20:160630:mhocko@suse.com::cGjDDu2AbETvoZ2K:003nvD X-Hashcash: 1:20:160630:gustavo.padovan@collabora.co.uk::eE9cZbh6zCUsdw8Z:0000000000000000000000000000005YlD X-Hashcash: 1:20:160630:hmijail@gmail.com::04/cL4pprgMhgmqd:000000000000000000000000000000000000000000004W0X X-Hashcash: 1:20:160630:linux@rasmusvillemoes.dk::OrS7qWFt09Df42/5:00000000000000000000000000000000000004s9N X-Hashcash: 1:20:160630:geert@linux-m68k.org::T7nvyww674WZEzcl:000000000000000000000000000000000000000008irZ X-Hashcash: 1:20:160630:akpm@linux-foundation.org::NoULYLERnxdoioyy:000000000000000000000000000000000000A8Ke Date: Thu, 30 Jun 2016 23:18:19 +0200 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jun 30 2016, Joe Perches wrote: > On Wed, 2016-06-29 at 21:52 +0300, Andy Shevchenko wrote: >> On Wed, 2016-06-29 at 20:31 +0200, Michal Nazarewicz wrote: > [] >> > tolower macro maps to __tolower function which calls isupper to >> > to determine if character is an upper case letter before converting >> > it to lower case.  This preservers non-letters unchanged which is >> > what you want in usual case. >> > >> > However, hex_to_bin does not care about non-letter characters so >> > such conversion can be performed as long as (i) upper case letters >> > become lower case, (ii) lower case letters are unchanged and (iii) >> > non-letters stay non-letters. >> > >> > This is exactly what _tolower function does and using it makes it >> > possible to avoid _ctype table lookup performed by the isupper >> > table. >> > >> > Furthermore, since _tolower conversion is done unconditionally, this >> > also eliminates a single branch. >> This change I agree with since _tolower() is specific for lib internal >> usage in the kernel. > > Perhaps _tolower should be used a bit more in lib > --- >  lib/string.c | 8 ++++---- >  1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/lib/string.c b/lib/string.c > index ed83562..b0e72fd 100644 > --- a/lib/string.c > +++ b/lib/string.c > @@ -53,8 +53,8 @@ int strncasecmp(const char *s1, const char *s2, size_t len) >   break; >   if (c1 == c2) >   continue; > - c1 = tolower(c1); > - c2 = tolower(c2); > + c1 = _tolower(c1); > + c2 = _tolower(c2); That won’t work. If someone really wanted, we probably could get away with: bool strneq(const char *s1, const char *s2, size_t len) { /* Yes, Virginia, it had better be unsigned */ unsigned char c1, c2, x; if (!len) return true; do { c1 = *s1++; c2 = *s2++; if (!c1 || !c2) break; x = c1 ^ c2; if (x && (x != 0x20 || !isalpha(c1) || _tolower(c1) != _tolower(c2))) return false; } while (--len); return c1 == c2; } I didn’t find any uses of strncasecmp where the result isn’t simply used as a boolean equal/non-equal test. This is a bigger undertaking though. We could try doing this though: --- include/linux/ctype.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/linux/ctype.h b/include/linux/ctype.h index 653589e..b1ef461 100644 --- a/include/linux/ctype.h +++ b/include/linux/ctype.h @@ -35,17 +35,19 @@ extern const unsigned char _ctype[]; #define isascii(c) (((unsigned char)(c))<=0x7f) #define toascii(c) (((unsigned char)(c))&0x7f) +#define _CTYPE_LOWER_BIT 0x20 /* bit determining if letter is lower case */ + static inline unsigned char __tolower(unsigned char c) { if (isupper(c)) - c -= 'A'-'a'; + c |= _CTYPE_LOWER_BIT; return c; } static inline unsigned char __toupper(unsigned char c) { if (islower(c)) - c -= 'a'-'A'; + c &= ~_CTYPE_LOWER_BIT; return c; } @@ -58,7 +60,7 @@ static inline unsigned char __toupper(unsigned char c) */ static inline char _tolower(const char c) { - return c | 0x20; + return c | _CTYPE_LOWER_BIT; } /* Fast check for octal digit */ -- 2.8.0.rc3.226.g39d4020 but whether it’s actually faster on modern hardware, I have no idea. Similarly, a lot of ‘foo - '0'’ could be replaced by ‘foo & 0xf’, but this again is a bigger undertaking. >   if (c1 != c2) >   break; >   } while (--len); > @@ -69,8 +69,8 @@ int strcasecmp(const char *s1, const char *s2) >   int c1, c2; >   >   do { > - c1 = tolower(*s1++); > - c2 = tolower(*s2++); > + c1 = _tolower(*s1++); > + c2 = _tolower(*s2++); >   } while (c1 == c2 && c1 != 0); >   return c1 - c2; >  } > > -- Best regards ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ «If at first you don’t succeed, give up skydiving»