Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lib/vsprintf.c: improve put_dec_trunc8 slightly

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 <linux@rasmusvillemoes.dk>
Cc: Tejun Heo <tj@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Rasmus Villemoes and committed by
Linus Torvalds
675cf53c cdb1dc3f

+4 -6
+4 -6
lib/vsprintf.c
··· 165 165 166 166 /* 167 167 * This will print a single '0' even if r == 0, since we would 168 - * immediately jump to out_r where two 0s would be written and one of 169 - * them then discarded. This is needed by ip4_string below. All other 170 - * callers pass a non-zero value of r. 168 + * immediately jump to out_r where two 0s would be written but only 169 + * one of them accounted for in buf. This is needed by ip4_string 170 + * below. All other callers pass a non-zero value of r. 171 171 */ 172 172 static noinline_for_stack 173 173 char *put_dec_trunc8(char *buf, unsigned r) ··· 206 206 out_r: 207 207 /* 1 <= r < 100 */ 208 208 *((u16 *)buf) = decpair[r]; 209 - buf += 2; 210 - if (buf[-1] == '0') 211 - buf--; 209 + buf += r < 10 ? 1 : 2; 212 210 return buf; 213 211 } 214 212