Skip to contentSkip to conversation

MIPS: Use ARCH_USE_BUILTIN_BSWAP.

PATCH In review Ralf Baechle 2 participants 7 messages Sep 29, 2015 MIPS

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 MIPS: Use ARCH_USE_BUILTIN_BSWAP.

ARCH_USE_BUILTIN_BSWAP will use __builtin_bswap16(), __builtin_bswap32() and __builtin_bswap64() where available. This allows better instruction scheduling. On pre-R2 processors it will result in 32 bit and 64 bit swapping being performed in a call to a __bswapsi2() rsp. __bswapdi2() functions, so we add these, too.

For a 4.2 kernel with GCC 4.9 this yields the following kernel sizes:

text data bss dec hex filename

3996071  155804   88992 4240867  40b5e3 vmlinux         ip22 baseline
3985687  159900   88992 4234579  409d53 vmlinux         ip22 + bswap patch
6913157  378552  251024 7542733  7317cd vmlinux         ip27 baseline
6878581  378552  251024 7508157  7290bd vmlinux         ip27 + bswap patch
5773777  268752  187424 6229953  5f0fc1 vmlinux         malta baseline
5773401  268752  187424 6229577  5f0e49 vmlinux         malta + bswap patch

Presumably the code size improvments yield better cache hit rate thus better performance compensating for the extra function call but this will still need to be benchmarked.

---
 arch/mips/Kconfig       |  1 +
 arch/mips/lib/Makefile  |  2 +-
 arch/mips/lib/bswapdi.c | 11 +++++++++++
 arch/mips/lib/bswapsi.c |  7 +++++++
 4 files changed, 20 insertions(+), 1 deletion(-)
arch/mips/Kconfig +1 -0
index a228e34..4ccb683 100644
@@ -3,6 +3,7 @@ config MIPS
 	default y
 	select ARCH_MIGHT_HAVE_PC_PARPORT
 	select ARCH_MIGHT_HAVE_PC_SERIO
+	select ARCH_USE_BUILTIN_BSWAP
 	select HAVE_CONTEXT_TRACKING
 	select HAVE_GENERIC_DMA_COHERENT
 	select HAVE_IDE
arch/mips/lib/Makefile +1 -1
index 1e9e900..0344e57 100644
@@ -15,4 +15,4 @@ obj-$(CONFIG_CPU_R3000)		+= r3k_dump_tlb.o
 obj-$(CONFIG_CPU_TX39XX)	+= r3k_dump_tlb.o
 
 # libgcc-style stuff needed in the kernel
-obj-y += ashldi3.o ashrdi3.o cmpdi2.o lshrdi3.o ucmpdi2.o
+obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o ucmpdi2.o
arch/mips/lib/bswapdi.c new file +11 -0
new file mode 100644
index 0000000..f69c41f
@@ -0,0 +1,11 @@
+unsigned long long __bswapdi2 (unsigned long long u)
+{
+	return (((u) & 0xff00000000000000ull) >> 56) |
+	       (((u) & 0x00ff000000000000ull) >> 40) |
+	       (((u) & 0x0000ff0000000000ull) >> 24) |
+	       (((u) & 0x000000ff00000000ull) >>  8) |
+	       (((u) & 0x00000000ff000000ull) <<  8) |
+	       (((u) & 0x0000000000ff0000ull) << 24) |
+	       (((u) & 0x000000000000ff00ull) << 40) |
+	       (((u) & 0x00000000000000ffull) << 56);
+}
arch/mips/lib/bswapsi.c new file +7 -0
new file mode 100644
index 0000000..2e3ba7f
@@ -0,0 +1,7 @@
+unsigned int __bswapsi2 (unsigned int u)
+{
+	return (((u) & 0xff000000) >> 24) |
+	       (((u) & 0x00ff0000) >>  8) |
+	       (((u) & 0x0000ff00) <<  8) |
+	       (((u) & 0x000000ff) << 24);
+}
#1 lore raw
Quoted 7 lines · Ralf Baechle

text data bss dec hex filename

3996071  155804   88992 4240867  40b5e3 vmlinux         ip22 baseline
3985687  159900   88992 4234579  409d53 vmlinux         ip22 + bswap patch
6913157  378552  251024 7542733  7317cd vmlinux         ip27 baseline
6878581  378552  251024 7508157  7290bd vmlinux         ip27 + bswap patch
5773777  268752  187424 6229953  5f0fc1 vmlinux         malta baseline
5773401  268752  187424 6229577  5f0e49 vmlinux         malta + bswap patch

A still unexplained effect of this patch and the reason why I have not committed this patch is the increase of the data size for the ip22 configuration by 4096 bytes. There is no change in data size expected. Also this affects only the test with ip22_defconfig not any of the others I've tried.

Ralf

#2 lore raw
Quoted 10 lines · Ralf Baechle
Quoted 7 lines · Ralf Baechle

text data bss dec hex filename

3996071  155804   88992 4240867  40b5e3 vmlinux         ip22 baseline
3985687  159900   88992 4234579  409d53 vmlinux         ip22 + bswap patch
6913157  378552  251024 7542733  7317cd vmlinux         ip27 baseline
6878581  378552  251024 7508157  7290bd vmlinux         ip27 + bswap patch
5773777  268752  187424 6229953  5f0fc1 vmlinux         malta baseline
5773401  268752  187424 6229577  5f0e49 vmlinux         malta + bswap patch
Quoted 5 lines

A still unexplained effect of this patch and the reason why I have not committed this patch is the increase of the data size for the ip22 configuration by 4096 bytes. There is no change in data size expected. Also this affects only the test with ip22_defconfig not any of the others I've tried.

Have you checked which object file(s) the increase comes from?

Signature · 2 lines
Måns Rullgård
[email protected]
#3 lore raw
Quoted 12 lines · Måns Rullgård
Quoted 10 lines · Ralf Baechle
Quoted 7 lines · Ralf Baechle

text data bss dec hex filename

3996071  155804   88992 4240867  40b5e3 vmlinux         ip22 baseline
3985687  159900   88992 4234579  409d53 vmlinux         ip22 + bswap patch
6913157  378552  251024 7542733  7317cd vmlinux         ip27 baseline
6878581  378552  251024 7508157  7290bd vmlinux         ip27 + bswap patch
5773777  268752  187424 6229953  5f0fc1 vmlinux         malta baseline
5773401  268752  187424 6229577  5f0e49 vmlinux         malta + bswap patch
Quoted 7 lines
Quoted 5 lines

A still unexplained effect of this patch and the reason why I have not committed this patch is the increase of the data size for the ip22 configuration by 4096 bytes. There is no change in data size expected. Also this affects only the test with ip22_defconfig not any of the others I've tried.

Have you checked which object file(s) the increase comes from?

Working on that.

Ralf

#4 lore raw
In reply to Måns Rullgård
Quoted 12 lines · Måns Rullgård
Quoted 10 lines · Ralf Baechle
Quoted 7 lines · Ralf Baechle

text data bss dec hex filename

3996071  155804   88992 4240867  40b5e3 vmlinux         ip22 baseline
3985687  159900   88992 4234579  409d53 vmlinux         ip22 + bswap patch
6913157  378552  251024 7542733  7317cd vmlinux         ip27 baseline
6878581  378552  251024 7508157  7290bd vmlinux         ip27 + bswap patch
5773777  268752  187424 6229953  5f0fc1 vmlinux         malta baseline
5773401  268752  187424 6229577  5f0e49 vmlinux         malta + bswap patch
Quoted 7 lines
Quoted 5 lines

A still unexplained effect of this patch and the reason why I have not committed this patch is the increase of the data size for the ip22 configuration by 4096 bytes. There is no change in data size expected. Also this affects only the test with ip22_defconfig not any of the others I've tried.

Have you checked which object file(s) the increase comes from?

The data size difference is created in the final link stage. data for all inividual .o files even vmlinux.o; only vmlinux differs.

Ralf

#5 lore raw
Quoted 20 lines · Ralf Baechle
Quoted 18 lines · Måns Rullgård
Quoted 15 lines · Ralf Baechle
Quoted 7 lines · Ralf Baechle

text data bss dec hex filename

3996071  155804   88992 4240867  40b5e3 vmlinux         ip22 baseline
3985687  159900   88992 4234579  409d53 vmlinux         ip22 + bswap patch
6913157  378552  251024 7542733  7317cd vmlinux         ip27 baseline
6878581  378552  251024 7508157  7290bd vmlinux         ip27 + bswap patch
5773777  268752  187424 6229953  5f0fc1 vmlinux         malta baseline
5773401  268752  187424 6229577  5f0e49 vmlinux         malta + bswap patch

A still unexplained effect of this patch and the reason why I have not committed this patch is the increase of the data size for the ip22 configuration by 4096 bytes. There is no change in data size expected. Also this affects only the test with ip22_defconfig not any of the others I've tried.

Quoted 4 lines
Quoted 1 line

Have you checked which object file(s) the increase comes from?

The data size difference is created in the final link stage. data for all inividual .o files even vmlinux.o; only vmlinux differs.

Could it be an alignment thing. Check if the alignment of some data section has changed from something smaller to 4096.

Signature · 2 lines
Måns Rullgård
[email protected]
#6 lore raw
Quoted 14 lines · Måns Rullgård
Quoted 14 lines
Quoted 14 lines
Quoted 13 lines
Quoted 7 lines

text data bss dec hex filename

3996071  155804   88992 4240867  40b5e3 vmlinux         ip22 baseline
3985687  159900   88992 4234579  409d53 vmlinux         ip22 + bswap patch
6913157  378552  251024 7542733  7317cd vmlinux         ip27 baseline
6878581  378552  251024 7508157  7290bd vmlinux         ip27 + bswap patch
5773777  268752  187424 6229953  5f0fc1 vmlinux         malta baseline
5773401  268752  187424 6229577  5f0e49 vmlinux         malta + bswap patch

A still unexplained effect of this patch and the reason why I have not committed this patch is the increase of the data size for the ip22 configuration by 4096 bytes. There is no change in data size expected. Also this affects only the test with ip22_defconfig not any of the others I've tried.

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

Have you checked which object file(s) the increase comes from?

The data size difference is created in the final link stage. data for all inividual .o files even vmlinux.o; only vmlinux differs.

Could it be an alignment thing. Check if the alignment of some data section has changed from something smaller to 4096.

Almost. Alignment has changed but 8k alignment of init_thread_union forced the linker to waste an extra 4k.

I always knew this could happen but never actually observed this. Hard to avoid but it's yet another reason to minimize stack size which on MIPS may be up to 4 pages for 64 bit kernels with 4k pages.

Ralf