From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751547AbbCSVp1 (ORCPT ); Thu, 19 Mar 2015 17:45:27 -0400 Received: from mail-lb0-f173.google.com ([209.85.217.173]:34602 "EHLO mail-lb0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750961AbbCSVpJ (ORCPT ); Thu, 19 Mar 2015 17:45:09 -0400 From: Rasmus Villemoes To: Andrew Morton , Rasmus Villemoes , "Peter Zijlstra (Intel)" , Tejun Heo Cc: linux-kernel@vger.kernel.org Subject: [PATCH] lib/vsprintf.c: improve put_dec_trunc8 slightly Date: Thu, 19 Mar 2015 22:44:41 +0100 Message-Id: <1426801481-1436-1-git-send-email-linux@rasmusvillemoes.dk> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1426237116-18457-1-git-send-email-linux@rasmusvillemoes.dk> References: <1426237116-18457-1-git-send-email-linux@rasmusvillemoes.dk> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I hadn't had enough coffee when I wrote this. Currently, the final increment of buf depends on the value loaded from the table, and causes gcc to emit a cmov immediately before the return. It is smarter to let it depend on r, since the increment can then be computed in parallel with the final load/store pair. It also shaves 16 bytes of .text. Signed-off-by: Rasmus Villemoes --- lib/vsprintf.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/vsprintf.c b/lib/vsprintf.c index e0bea9e5bbbf..7078d90c187b 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -164,9 +164,9 @@ static const u16 decpair[100] = { /* * This will print a single '0' even if r == 0, since we would - * immediately jump to out_r where two 0s would be written and one of - * them then discarded. This is needed by ip4_string below. All other - * callers pass a non-zero value of r. + * immediately jump to out_r where two 0s would be written but only + * one of them accounted for in buf. This is needed by ip4_string + * below. All other callers pass a non-zero value of r. */ static noinline_for_stack char *put_dec_trunc8(char *buf, unsigned r) @@ -205,9 +205,7 @@ out_q: out_r: /* 1 <= r < 100 */ *((u16 *)buf) = decpair[r]; - buf += 2; - if (buf[-1] == '0') - buf--; + buf += r < 10 ? 1 : 2; return buf; } -- 2.1.3