From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from 6.mo560.mail-out.ovh.net (6.mo560.mail-out.ovh.net [87.98.165.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF4503EFD3D for ; Tue, 20 Jan 2026 23:50:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=87.98.165.38 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768953035; cv=none; b=KOM7dFzCqSc4DxtXEDlX0wFZ1asI1+yg5+1rmYJXDdZz1/R89iYtg6faKHoJEtWNmOdeGXdlWUpj0TZFnqSKTFbRLasvfHKDlJjOwZoD5Pw3itzy/4rptqv+cZdHvuB/JfYMcu27VI2jDZ2gSW7Q2PW2rz45ezWHHeUeUfZznfI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768953035; c=relaxed/simple; bh=dnZMJQmTKoQlc0W8/Gqek3yWDztGO1eNgumNk2N78BI=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=TVnqTPBsHNqlqGUBk3RdLf2XvwDoniH1s6XhTfsTa3T+gCOIAVKkQNenpSFg+aMdF9QnPuA3Wxjfrve527jY509xvuDx3qATRkGUW10/AicSs0EKj4LMK2y1oaMcwW15ye3nxLNW+zVZuuAcxaagULWxml4AzgLO5ymg6ZkhXeA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=formalgen.com; spf=pass smtp.mailfrom=formalgen.com; dkim=pass (2048-bit key) header.d=formalgen.com header.i=@formalgen.com header.b=W7mYiKQ3; arc=none smtp.client-ip=87.98.165.38 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=formalgen.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=formalgen.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=formalgen.com header.i=@formalgen.com header.b="W7mYiKQ3" Received: from director5.ghost.mail-out.ovh.net (unknown [10.110.0.14]) by mo560.mail-out.ovh.net (Postfix) with ESMTP id 4dwkCH6GT0zBKK2 for ; Tue, 20 Jan 2026 23:32:59 +0000 (UTC) Received: from ghost-submission-7d8d68f679-d42f2 (unknown [10.110.96.237]) by director5.ghost.mail-out.ovh.net (Postfix) with ESMTPS id EA43410015D; Tue, 20 Jan 2026 23:32:58 +0000 (UTC) Received: from formalgen.com ([37.59.142.107]) by ghost-submission-7d8d68f679-d42f2 with ESMTPSA id biMvMqoQcGmN3QYAPkCUGQ (envelope-from ); Tue, 20 Jan 2026 23:32:58 +0000 Authentication-Results:garm.ovh; auth=pass (GARM-107S0013277275f-2ad9-47d3-a297-571b07a900c8, 831801AFC7761530D51FB11603EF4B8E66579AB0) smtp.auth=david.desobry@formalgen.com X-OVh-ClientIp:90.91.42.105 Message-ID: Date: Wed, 21 Jan 2026 00:32:58 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2] x86/lib: Optimize num_digits() and fix INT_MIN overflow To: David Laight Cc: tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org References: <20260120174748.302078-1-david.desobry@formalgen.com> <20260120214612.73b83cbe@pumpkin> Content-Language: en-US From: David Desobry In-Reply-To: <20260120214612.73b83cbe@pumpkin> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Ovh-Tracer-Id: 1201053727888755675 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: dmFkZTEsFWmGlTV60Qzki3JkAFDEZHOic4qEcolPkrIsj1cYeD+cym96Xnqzwvq8cPTiO72ypW88lLsGkDjUuoQwyFw0CiK57uTaOlRddFYpuvlJTF0n/WLlLa8/0AUBT33NnRraLUdTAGEbvwev/cV+562CGixzGFI99GnDoOy0NOYTEjm2R1juEBn3VbM4dOy3hc/gkfKE9S9cV2X0Sou/3kOvtQBjlt8/YPhcGs8ZCZSioXp3cP+BFn5W3wVQ6b1lXOa05O1RtStvECE3cw3PjI03T7kHt1qUzKn6IF4VykGMGAJpnHgBAfq5Waw0ukYiJFumF9SqEzfWYiXyQ7Uf4ObHaHPZSeHrDBVyZ2iarw0AQT8ijtMHZdPrG6wml85j+fcbqEataPeKAH1aT7Mx7Z8kumhGCpNT9r8cUq8MZMZYQ26x5fOQEJuALyPtl8pNKPFushcxkyhO0EQAxLrUMBdPGFIR1pSDzefCr1+mVMBzKbK0Hkqf8hoK0+BNswsEZZkAMggHlnZmPjaQ44uiERuWxBvc780H+5i2t35vSwvajPQZ3LLd3MTNXxfkClAdFucQQT4Q4RTQyDjb9pSLnjtaw4otLm1FigpX8nmZiNkAQH8jzsK1Ua3gGxTJL6zDnvysOVniVbLmPS2Zplkt9jb8pYRofxi1IWclpMN0UBcciA DKIM-Signature: a=rsa-sha256; bh=/LUZBUmWIjQAI8kiJIqz+sg4xnhLOQZMg+quP8QNmUU=; c=relaxed/relaxed; d=formalgen.com; h=From; s=ovhmo-selector-1; t=1768951979; v=1; b=W7mYiKQ3Ts88+X+A1zHP2YAqo0gIoMbw1sidCop97cWgCIrIVgzR3pzbEf17q4FRzXKRsUdX vxvfzdxf4hakA4FTiruko/RBrpqKl9rOhMCYZwqK67qORlp4uPIczE+BIy3npz8L5PhBS2qbIAX PI8i3gPjMoxOgeXVWL3rk3/YZ/2rNp2NpwS+fgvEhNvDb7FpScfpb3PQlYJ3xKACDR5hS7WyzRG yHwggTiF2G1wd5JsBPPaa51rnfa4Jd/p8fSfp6MmvyQ1w+qVz2Ji4wiUo2xSjYcTY5Ode9SszzK CtqJpcNeKHP4swu8OkIrXBuAwR7Md2RRjfTyyd9vBiCeQ== On 1/20/26 22:46, David Laight wrote: > > Maybe better to write as: > if (val < 0) { > d = 1; > v = -val; > } else { > d = 0; > v = val; > } > The compiler will only generate one jump. Agreed, I've adopted this in v3. > >> >> - while (val >= m) { >> - m *= 10; >> - d++; >> + switch (v) { >> + case 0 ... 9: >> + return d + 1; >> + case 10 ... 99: >> + return d + 2; >> + case 100 ... 999: >> + return d + 3; >> + case 1000 ... 9999: >> + return d + 4; >> + case 10000 ... 99999: >> + return d + 5; >> + case 100000 ... 999999: >> + return d + 6; >> + case 1000000 ... 9999999: >> + return d + 7; >> + case 10000000 ... 99999999: >> + return d + 8; >> + case 100000000 ... 999999999: >> + return d + 9; >> + default: >> + return d + 10; > > clang generates something really horrid for that. > > Either: > if (v <= 9) return d + 1; > if (v <= 99) return d + 2; > if (v <= 999) return d + 3; > if (v <= 9999) return d + 4; > if (v <= 99999) return d + 5; > if (v <= 999999) return d + 6; > if (v <= 9999999) return d + 7; > if (v <= 99999999) return d + 8; > if (v <= 999999999) return d + 9; > return d + 10; > or: > if ((++d && v > 9) && > (++d && v > 99) && > (++d && v > 999) && > (++d && v > 9999) && > (++d && v > 99999) && > (++d && v > 999999) && > (++d && v > 9999999) && > (++d && v > 99999999) && > (++d && v > 999999999)) > d++; > return d; > generate better code. > In particular it is almost certainly best to only have one taken branch. > Dumping in a load of unlikely() might help that as well. > (Neither compiler does the ++d inline, the add is done before the return.) Good catch. I have replaced the switch statement with a linear if-chain in v3 to ensure better code generation for both GCC and Clang. David