summaryrefslogtreecommitdiff
path: root/Documentation
diff options
context:
space:
mode:
authorTrent Piepho <xyzzy@speakeasy.org>2007-05-08 00:24:05 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 11:14:59 -0700
commit8e2c20023f34b652605a5fb7c68bb843d2b100a8 (patch)
treebd041c1762724dbbc91f4b2da3fc0716165784e5 /Documentation
parent02fb6149f7a64c62934c035e7635321cb9a8cf2e (diff)
downloadlinux-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')
0 files changed, 0 insertions, 0 deletions