From nobody Sun Feb 8 16:05:08 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A35BC3246EC for ; Tue, 3 Feb 2026 10:30:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114618; cv=none; b=nj1lUUwt3BMjA8l1a1OExA10+xADcNYo8oaIZQ4vl9qWp15c3DoOXCx01p1KjqBen/6qwJQrgEeChEOJsw0FdfKn3V0LTxP4/QvfsldEsPWX1SUSMrQlE7H++cn4i1e59G+cFjWYRHlMuf21gN3DApK53Rp0T4kymFT8wx/WWB0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114618; c=relaxed/simple; bh=frM8mpM62krA7/yGtOgE8jZ0mrpDlC5OeRDxyJLbNS4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HoArdzRNw7lFMcy031Epa+gtmPyJFGwMxkF/jY8DKlmjZtunZfP8Rh6qaKxuTSLWoqdcIZ5NxJy21ro3MrFH5iF8VJGEHTS/Cxyg8R3796EXrOGQ9IC6NFHyT8HRmdD6PbazCs3qjsqrkETiIbzB+rz+r+BHr3rQlDCqaHwfUc8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=O9sLKYHa; arc=none smtp.client-ip=209.85.221.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="O9sLKYHa" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-430f3ef2d37so4689376f8f.3 for ; Tue, 03 Feb 2026 02:30:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114615; x=1770719415; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=j5pSmti+eAXEULK/8/Hmh9E/QurwC7O3QBA6/81Tie4=; b=O9sLKYHaH15YM5cTYVMoZa6WS5VdThcuz/w/Ah42C57Zawz+zlQvK24tqB5DYCEHzz PYTsUETbT2xFmls7pWESgsYVjeuD+qfOV5nRXHtvNI+JRtmFuBOTqrgom8SaVvGvqjQa BTeA8MvZ39B+v9Stmcvo/Pn5bFf7jpxs8cAe2Kko312y1ZoU+pr0/Jx7ccfQlfcsUIth aF3sF2uSWE7lCvAi7Exqj58w30+8x3V9g2P43tz1Ffvsx63XJC4Z+9rBJ6oF17z0PFjS 6SiuUKq7xzQ1YfMRLAN3q+1Gl2B0jOKvZNmRoafxuPVQ4Ue87XQugEvQrwY4jMMEhTbp wi/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114615; x=1770719415; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=j5pSmti+eAXEULK/8/Hmh9E/QurwC7O3QBA6/81Tie4=; b=wp0fQvpm5d2c5FbITs4FzgBBoIzEKNInQ4R8Nb4CYv71zLLiwgSw6avUhi8qTH59Tk ROvX24nPYZRULKBwx8kOGOaBhN4D38nsobGpw9ozVNJzilrMsiyXFx/GR2MWze0aHdcG eZKu28FNeeBv7kgbaWN+Ct4UvpGXArtzw4SH72pmXb2oNk7PwWGV5nfzm1/+ychXyrFN NFw6YRl4tsA8Ia2cxsRAbflaWpsqbIZ0pEKdn8mea6o3hE7gcYbhXzTem7CoqLXq9fpk fbiozpLOw2F0iKepaSFbgQKZVwGLB2DuGP9SbZe1iPDWoE/jzmEc3ycMhFaCE0qUmLVr 4k7Q== X-Forwarded-Encrypted: i=1; AJvYcCUXC3GFLCNneeOauuYjcPj2DcTIEVOOwdiP2245sLBmyFf8tyCEdgl29styXql6h8/xLr79Pruy/liD9Gs=@vger.kernel.org X-Gm-Message-State: AOJu0YxIVQUGUEfSapE3Mq3mKUfadpO6BHIHN1azetFufvPFeKQEYH4c ARjSwcrRCvMHCc/axcXrmf5t3VAi4VxJp4Oo+1IbqFzc/OysU3bqs2HA X-Gm-Gg: AZuq6aJWiQALL4W7h3MkZkEwiaUTNeC1gWTVBV/57l7f1v0kI/N2bWXvlgVYsPf1knb aBjbnnyk3/YCFIzw54LYMxc6R2Ewek+BMWlPpz0yWh2TfRrLLVp9FUFz3aHwkry+IWkNguzTMam yZzHeieIZ4ZeS3KNzBa83nrzBZ4ti5S5wJMuu+xdWphgNjh/r/P+koqTK99MxI5UEidyL7V45TA EqWjxUtsufIVmHj7w7PshF8vgscwUPv/zGBOjNsM8TJtailaSlHxtDjmbosDGkCbTPMkMOv57ml d/f98yEYrmXrpe/BKUd2eeazxqvefPGasYSCJP/BnEeQ/6FDAa5HAvkh+mMxw2Zk+vjf1Zgf3iK 7dsa9NAkOi8O+FdJkN8nnZLIyZUwOqgL8A3QhXE/ayS6GVMUJUwDokPecg1iJ+a4oTtqFqYM2KP EMfw/HAKDZfddXVa14/D2ghbBvyg0S45HjScwsYth9s2a2rNh6qAF5noOhsJ7sVKmMZWkPaYc2 X-Received: by 2002:a5d:4e8e:0:b0:436:b45:749c with SMTP id ffacd0b85a97d-4360b4574a2mr5481727f8f.6.1770114614959; Tue, 03 Feb 2026 02:30:14 -0800 (PST) Received: from snowdrop.snailnet.com (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:14 -0800 (PST) From: david.laight.linux@gmail.com To: Willy Tarreau , =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= , linux-kernel@vger.kernel.org, Cheng Li Cc: David Laight Subject: [PATCH next 10/12] tools/nolibc/printf: Use bit-pattern for integral formats Date: Tue, 3 Feb 2026 10:29:58 +0000 Message-Id: <20260203103000.20206-11-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-1-david.laight.linux@gmail.com> 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 Content-Type: text/plain; charset="utf-8" From: David Laight Generates better code when code is common for multiple formats. In particular it stops two calls to u64toa_r(). Signed-off-by: David Laight --- tools/include/nolibc/stdio.h | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index bad528921590..23fe8b8e7767 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -241,7 +241,7 @@ char *fgets(char *s, int size, FILE *stream) =20 =20 /* printf(). Supports most of the normal integer and string formats. - * - %[#0-+ ][width|*[.precision|*]][{l,t,z,ll,L,j,q}]{d,i,u,c,x,X,p,s,m} + * - %[#0-+ ][width|*[.precision|*]][{l,t,z,ll,L,j,q}]{d,i,u,c,x,X,p,s,m,= %} * - %% generates a single % * - %m outputs strerror(errno). * - # only affects %x and prepends 0x to non-zero values. @@ -258,7 +258,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list { char c; int len, written, width, precision; - unsigned int flags; + unsigned int flags, c_flag; char tmpbuf[32 + 24]; const char *outstr; =20 @@ -326,8 +326,12 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state= , const char *fmt, va_list if (!((c >=3D 'a' && c <=3D 'z') || (c =3D=3D 'X' && (c =3D 'x')))) goto bad_conversion_specifier; =20 - /* Numeric and pointer conversion specifiers */ - if (__PF_FLAG(c) & (__PF_FLAG('c') | __PF_FLAG('d') | __PF_FLAG('i') | = __PF_FLAG('u') | + /* Numeric and pointer conversion specifiers. + * We need to check for "%p" or "%#x" later, merging here gives better = code. + * But '#' collides with 'c' so shift right. + */ + c_flag =3D __PF_FLAG(c) | (flags & __PF_FLAG('#')) >> 1; + if (c_flag & (__PF_FLAG('c') | __PF_FLAG('d') | __PF_FLAG('i') | __PF_F= LAG('u') | __PF_FLAG('x') | __PF_FLAG('p') | __PF_FLAG('s'))) { unsigned long long v; long long signed_v; @@ -335,7 +339,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list int sign =3D 0; =20 /* Annoying 'p' =3D=3D=3D '0' so mask from flags */ - if ((__PF_FLAG(c) | (flags & ~__PF_FLAG('p'))) & + if ((c_flag | (flags & ~__PF_FLAG('p'))) & (__PF_FLAG('p') | __PF_FLAG('s') | __PF_FLAG('l') | __PF_FLAG('t')= | __PF_FLAG('z'))) { v =3D va_arg(args, unsigned long); signed_v =3D (long)v; @@ -347,13 +351,14 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list signed_v =3D (int)v; } =20 - switch (c) { - case 'c': + if (c_flag & __PF_FLAG('c')) { tmpbuf[0] =3D v; len =3D 1; outstr =3D tmpbuf; goto do_output; - case 's': + } + + if (c_flag & __PF_FLAG('s')) { if (!v) { outstr =3D "(null)"; /* Match glibc, nothing output if precision too small */ @@ -364,8 +369,9 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state,= const char *fmt, va_list do_strnlen_output: len =3D strnlen(outstr, precision); goto do_output; - case 'd': - case 'i': + } + + if (c_flag & (__PF_FLAG('d') | __PF_FLAG('i'))) { if (signed_v < 0) { sign =3D '-'; v =3D -(signed_v + 1); @@ -375,12 +381,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list } else if (flags & __PF_FLAG(' ')) { sign =3D ' '; } - c =3D 'u'; } =20 if (v =3D=3D 0) { /* There are special rules for zero. */ - if (c =3D=3D 'p') { + if (c_flag & __PF_FLAG('p')) { /* match glibc, precision is ignored */ outstr =3D "(nil)"; len =3D 5; @@ -395,11 +400,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *stat= e, const char *fmt, va_list *out =3D '0'; len =3D 1; } else { - if (c =3D=3D 'u') { + if (c_flag & (__PF_FLAG('d') | __PF_FLAG('i') | __PF_FLAG('u'))) { len =3D u64toa_r(v, out); } else { len =3D u64toh_r(v, out); - if (c =3D=3D 'p' || (flags & __PF_FLAG('#'))) + if (c_flag & (__PF_FLAG('p') | __PF_FLAG('#' - 1))) sign =3D 'x' | '0' << 8; } } --=20 2.39.5