MIPS: Use ARCH_USE_BUILTIN_BSWAP.
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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,7 @@ +unsigned int __bswapsi2 (unsigned int u) +{ +return (((u) &0xff000000 ) >>24 ) | + (((u) &0x00ff0000 ) >>8 ) | + (((u) &0x0000ff00 ) <<8 ) | + (((u) &0x000000ff ) <<24 ); +}
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
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_defconfignot 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]
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_defconfignot any of the others I've tried.Have you checked which object file(s) the increase comes from?
Working on that.
Ralf
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_defconfignot 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
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 patchA 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_defconfignot 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]
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 patchA 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_defconfignot 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