diff options
author | Trent Piepho <xyzzy@speakeasy.org> | 2007-05-08 00:24:05 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 11:14:59 -0700 |
commit | 8e2c20023f34b652605a5fb7c68bb843d2b100a8 (patch) | |
tree | bd041c1762724dbbc91f4b2da3fc0716165784e5 /Documentation/SubmittingDrivers | |
parent | 02fb6149f7a64c62934c035e7635321cb9a8cf2e (diff) | |
download | linux-3.10-8e2c20023f34b652605a5fb7c68bb843d2b100a8.tar.gz linux-3.10-8e2c20023f34b652605a5fb7c68bb843d2b100a8.tar.bz2 linux-3.10-8e2c20023f34b652605a5fb7c68bb843d2b100a8.zip |
Fix constant folding and poor optimization in byte swapping code
Constant folding does not work for the swabXX() byte swapping functions,
and the C versions optimize poorly.
Attempting to initialize a global variable to swab16(0x1234) or put
something like "case swab32(42):" in a switch statement will not compile.
It can work, swab.h just isn't doing it correctly. This patch fixes that.
Contrary to the comment in asm-i386/byteorder.h, gcc does not recognize the
"C" version of swab16 and turn it into efficient code. gcc can do this,
just not with the current code. The simple function:
u16 foo(u16 x) { return swab16(x); }
Would compile to:
movzwl %ax, %eax
movl %eax, %edx
shrl $8, %eax
sall $8, %edx
orl %eax, %edx
With this patch, it will compile to:
rolw $8, %ax
I also attempted to document the maze different macros/inline functions
that are used to create the final product.
Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Cc: Francois-Rene Rideau <fare@tunes.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'Documentation/SubmittingDrivers')
0 files changed, 0 insertions, 0 deletions