Skip to content

Commit

Permalink
lib/vsprintf.c: improve put_dec_trunc8 slightly
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Tejun Heo <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Villemoes authored and torvalds committed Apr 17, 2015
1 parent cdb1dc3 commit 675cf53
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions lib/vsprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,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)
Expand Down Expand Up @@ -206,9 +206,7 @@ char *put_dec_trunc8(char *buf, unsigned r)
out_r:
/* 1 <= r < 100 */
*((u16 *)buf) = decpair[r];
buf += 2;
if (buf[-1] == '0')
buf--;
buf += r < 10 ? 1 : 2;
return buf;
}

Expand Down

0 comments on commit 675cf53

Please sign in to comment.