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

Configure Feed

Select the types of activity you want to include in your feed.

interconnect: Optimize kbps_to_icc() macro

The current expansion of kbps_to_icc() introduces unnecessary logic
when compiled from a general expression. Rewriting it allows compilers
to emit shorter and more efficient code across architectures.

For example, with gcc -O2:

arm64:

old:
tst x0, 7
add w1, w0, 7
cset w2, ne
cmp w0, 0
csel w0, w1, w0, lt
add w0, w2, w0, asr 3

new:
add w1, w0, 14
adds w0, w0, 7
csel w0, w1, w0, mi
asr w0, w0, 3

x86-64:

old:
xor eax, eax
test dil, 7
lea edx, [rdi+7]
setne al
test edi, edi
cmovns edx, edi
sar edx, 3
add eax, edx

new:
lea eax, [rdi+14]
add edi, 7
cmovns eax, edi
sar eax, 3

In both cases the old form relies on extra test and compare
instructions (tst, test, cmp) combined with conditional moves or sets,
while the new form uses fewer instructions by folding the addition and
flag update together (adds on arm64, add on x86).

This reduces the instruction sequence, prevents multiple evaluations of
x when it is an expression or a function call, and keeps the macro
simpler.

Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Link: https://lore.kernel.org/r/20250930043055.2200322-1-visitorckw@gmail.com
Signed-off-by: Georgi Djakov <djakov@kernel.org>

authored by

Kuan-Wei Chiu and committed by
Georgi Djakov
245f14f5 3a866087

+1 -1
+1 -1
include/linux/interconnect.h
··· 16 16 #define MBps_to_icc(x) ((x) * 1000) 17 17 #define GBps_to_icc(x) ((x) * 1000 * 1000) 18 18 #define bps_to_icc(x) (1) 19 - #define kbps_to_icc(x) ((x) / 8 + ((x) % 8 ? 1 : 0)) 19 + #define kbps_to_icc(x) (((x) + 7) / 8) 20 20 #define Mbps_to_icc(x) ((x) * 1000 / 8) 21 21 #define Gbps_to_icc(x) ((x) * 1000 * 1000 / 8) 22 22