From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751908AbcF2WGS (ORCPT ); Wed, 29 Jun 2016 18:06:18 -0400 Received: from mail-lf0-f47.google.com ([209.85.215.47]:34889 "EHLO mail-lf0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751527AbcF2WGQ (ORCPT ); Wed, 29 Jun 2016 18:06:16 -0400 Date: Thu, 30 Jun 2016 01:06:11 +0300 From: Alexey Dobriyan To: zengzhaoxiu@163.com Cc: linux-kernel@vger.kernel.org, Zhaoxiu Zeng , Andrew Morton , Kees Cook Subject: Re: [PATCH 2/2] lib: kstrtox: _parse_integer: use hex_to_bin instead local conversion, and reduce branches Message-ID: <20160629220611.GA13735@p183.telecom.by> References: <1467216957-58885-1-git-send-email-zengzhaoxiu@163.com> <1467217334-58990-1-git-send-email-zengzhaoxiu@163.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1467217334-58990-1-git-send-email-zengzhaoxiu@163.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jun 30, 2016 at 12:22:13AM +0800, zengzhaoxiu@163.com wrote: > --- a/lib/kstrtox.c > +++ b/lib/kstrtox.c > @@ -48,38 +48,26 @@ unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long > { > unsigned long long res; > unsigned int rv; > - int overflow; > + unsigned int overflow; > + unsigned int val; > > res = 0; > rv = 0; > overflow = 0; > - while (*s) { > - unsigned int val; > - > - if ('0' <= *s && *s <= '9') > - val = *s - '0'; > - else if ('a' <= _tolower(*s) && _tolower(*s) <= 'f') > - val = _tolower(*s) - 'a' + 10; > - else > - break; > - > - if (val >= base) > - break; > + while ((val = hex_to_bin(*s++)) < base) { I hate this function. And it has a branch if your table patch doesn't go it. And it is beartrap (unsigned int = -1 < base). ACK *s++ bit, though. Should make code smaller in my experience. Please, change to "unsigned char c; while ((c = *s++)". This is about maximum code compression I can understand. > /* > * Check for overflow only if we are within range of > * it in the max base we support (16) > */ > if (unlikely(res & (~0ull << 60))) { > if (res > div_u64(ULLONG_MAX - val, base)) > - overflow = 1; > + overflow = KSTRTOX_OVERFLOW; Just do |= KSTRTOX_OVERFLOW here directly, it is the leftmost bit. > } > res = res * base + val; > rv++; > - s++; > } > *p = res; > - if (overflow) > - rv |= KSTRTOX_OVERFLOW; > + rv |= overflow; > return rv; > }