From nobody Mon Feb 9 10:27:23 2026 Received: from 12.mo581.mail-out.ovh.net (12.mo581.mail-out.ovh.net [178.33.107.167]) (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 EBF333B8D63 for ; Tue, 20 Jan 2026 23:20:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=178.33.107.167 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768951219; cv=none; b=LDO2a50cEW5Xs+PG5PNKaYsFa3kZCI1JbCXn9y3rioVrYTdPmpRvING+ldYLAvruulV4WSVZ7OiD6iziSoQ+O8Y1XlTC9Zi4ImaFBk2GLmIs8ZvCUWYbEQyWrwf2klXqPam12stX//y4Xj2CETmB+pWVOin4LHmwHFb2VPvfHjg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768951219; c=relaxed/simple; bh=xc/Jiy7pnxEj22MT0tzBSB2/3sRlMAOO5AheO/DZlkY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tpiiGtOfUPiUN6XndxDMLdXxfeoPgU3FShdMjAb5c2ffxyBYWa9RY1rPrifB9T1wrMvKuk/KJI5SennOaBnnE573f7sbtjmeB4VFuX1yxobZvRoIKFFDrxl3BYoifQD412Lx//8UuzjtqAYW0ByWQOMLO6RKWutYpKhVeiCfshg= 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=BXXRpcCv; arc=none smtp.client-ip=178.33.107.167 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="BXXRpcCv" Received: from director3.ghost.mail-out.ovh.net (unknown [10.110.58.48]) by mo581.mail-out.ovh.net (Postfix) with ESMTP id 4dwjwQ3dT4z5y47 for ; Tue, 20 Jan 2026 23:20:06 +0000 (UTC) Received: from ghost-submission-7d8d68f679-9tgq9 (unknown [10.110.168.56]) by director3.ghost.mail-out.ovh.net (Postfix) with ESMTPS id C7623C05C2; Tue, 20 Jan 2026 23:20:05 +0000 (UTC) Received: from formalgen.com ([37.59.142.99]) by ghost-submission-7d8d68f679-9tgq9 with ESMTPSA id mJ8oJKUNcGlK5wAASAzbtw (envelope-from ); Tue, 20 Jan 2026 23:20:05 +0000 Authentication-Results: garm.ovh; auth=pass (GARM-99G0034b6877d0-4cb3-4cfd-b4bc-070c3a8570d8, 831801AFC7761530D51FB11603EF4B8E66579AB0) smtp.auth=david.desobry@formalgen.com X-OVh-ClientIp: 90.91.42.105 From: David Desobry To: tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com Cc: x86@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org, David Desobry Subject: [PATCH v3] x86/lib: Optimize num_digits() and fix INT_MIN overflow Date: Wed, 21 Jan 2026 00:19:40 +0100 Message-ID: <20260120231940.17557-1-david.desobry@formalgen.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260120214612.73b83cbe@pumpkin> References: <20260120214612.73b83cbe@pumpkin> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 983473572741303243 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: dmFkZTGGncsceaCRmehj1K7at+O6jsQ45XoN7l54d076c8zdnd0C/5os24xWbekJyBnjlpby1UpaKAaF3JK7bW7bxJat5OOGJTCwWalZK5+2wJV7jaZyZLPYunR/IXj422TQ9yST6DV0UN8KbkQVZvuNjF6AfgdC3HQ8WA050+H9QFfWbsn3PqZRZGUKKYaCb6/NJhARC3oX0DTMXMGQiFDqQALO4mhzRLqBQP2uD1JVSB3Hsv/7lw5MPClmjTLVEVp7YofhNFxIv1zJg/W49aPd+CXOIdpRuUcSF32/+kuwV6kZ3HAXDDccHDMc3j9WYJqTvBcqRmQwM9sV2QtzA2aKWpNrCDMo0K2MB/ze7vkWyG5RJUz4H5b8utPx3Vg2SIppbX7/iybx/wmHQ5NPD9BaZeYnIihITFnxqnFfM4Iv2nieoYTZZeSJXUZdQOJQUOhYtUFwOu4rhgT/jCQSz5S+qxon3+Z6gq+D400rtWvd+1Mps1yHP2iwM2pZJlln0X1qoLy4GOgcHoGY5nUDpliAM+oDcFWQpl+T563btPHj3HzfE9DFea7Tje0iPHWIfP3UVXUkclOGbJIquwaqXnTjZRUhlkv5QHJYLt2bsfW1ZNSwiS6GXPy8SknX9dAHRgwGItTx0+4Rceq1ZUa0vLbWjQzv5MO1DXp0HKyhLlG0AFQFJQ DKIM-Signature: a=rsa-sha256; bh=Eru4vqtOnddTnBstxAN//9tf0HphNDrDNQ/3J2tj4ks=; c=relaxed/relaxed; d=formalgen.com; h=From; s=ovhmo-selector-1; t=1768951206; v=1; b=BXXRpcCvAkBb5Woe4FDog3tniYeRDTC0gAGx+0YlWitT9nVeSt6jSmH/ba0Gbwx2Lr8p7RM1 ucwTV/F70o1G8QDfazUAcPFvf87KAfuTTyF1DzI8ygMrxgsaNGXC+OjOvKXbh7vkVy78lMrQgFb bopMe4VvA0TanrxopLf0cLEDbP7Y+Up2Ueu1/oWq1fL80eQ8jLhu1dM50mknrk2zpc0388eMfkA 9LPfsIEc6UNM8DIbXOz2Dzb5XWBxesqnpqtXl48MjpPCTspXhgoTPb8cDfBIpBZp6TaoO4JAOBz PiI9/UPI6x72oMO+79n+y2h+Hj4vW138hTyYWPjc4HRqg== Content-Type: text/plain; charset="utf-8" The current implementation of num_digits() uses a loop with repeated multiplication, which is inefficient. Furthermore, the negation of the input value "val =3D -val" causes undefined behavior when val is INT_MIN, as its absolute value cannot be represented as a 32-bit integer. Replace the loop with a linear chain of comparisons. This allows the compiler to generate optimized branch sequences, providing better performance than the original loop and more efficient assembly than a switch statement on compilers like Clang. By using an internal unsigned int to handle the magnitude, we safely handle the INT_MIN case without relying on 64-bit types or triggering undefined signed overflow. Removed the outdated comment. Signed-off-by: David Desobry --- v3: - Replaced switch statement with a linear if-chain for better compiler=20 optimization. - Simplified sign handling logic to a single if/else block. - (v2) Fixed INT_MIN overflow using unsigned magnitude and removed=20 outdated comment. arch/x86/lib/misc.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/arch/x86/lib/misc.c b/arch/x86/lib/misc.c index 40b81c338ae5..3d56583411cf 100644 --- a/arch/x86/lib/misc.c +++ b/arch/x86/lib/misc.c @@ -3,22 +3,38 @@ =20 /* * Count the digits of @val including a possible sign. - * - * (Typed on and submitted from hpa's mobile phone.) */ int num_digits(int val) { - long long m =3D 10; - int d =3D 1; + unsigned int v; + int d; =20 if (val < 0) { - d++; - val =3D -val; + d =3D 1; + v =3D -val; + } else { + d =3D 0; + v =3D val; } =20 - while (val >=3D m) { - m *=3D 10; - d++; - } - return d; + if (v <=3D 9) + return d + 1; + if (v <=3D 99) + return d + 2; + if (v <=3D 999) + return d + 3; + if (v <=3D 9999) + return d + 4; + if (v <=3D 99999) + return d + 5; + if (v <=3D 999999) + return d + 6; + if (v <=3D 9999999) + return d + 7; + if (v <=3D 99999999) + return d + 8; + if (v <=3D 999999999) + return d + 9; + + return d + 10; } --=20 2.43.0