[PATCH] lib: bitrev.c micro-optimization

From: Harvey Harrison
Date: Tue Apr 29 2008 - 01:25:14 EST


X86_32 before:
00000000 <bitrev32>:
0: 55 push %ebp
1: 89 c1 mov %eax,%ecx
3: 89 e5 mov %esp,%ebp
5: 0f b6 cd movzbl %ch,%ecx
8: 53 push %ebx
9: 89 c3 mov %eax,%ebx
b: 0f b6 c0 movzbl %al,%eax
e: 0f b6 90 00 00 00 00 movzbl 0x0(%eax),%edx
15: c1 eb 10 shr $0x10,%ebx
18: 66 0f b6 81 00 00 00 movzbw 0x0(%ecx),%ax
1f: 00
20: c1 e2 08 shl $0x8,%edx
23: 09 d0 or %edx,%eax
25: 0f b6 d3 movzbl %bl,%edx
28: 0f b6 8a 00 00 00 00 movzbl 0x0(%edx),%ecx
2f: 0f b6 d7 movzbl %bh,%edx
32: 66 0f b6 92 00 00 00 movzbw 0x0(%edx),%dx
39: 00
3a: c1 e0 10 shl $0x10,%eax
3d: 5b pop %ebx
3e: 5d pop %ebp
3f: c1 e1 08 shl $0x8,%ecx
42: 09 ca or %ecx,%edx
44: 0f b7 d2 movzwl %dx,%edx
47: 09 d0 or %edx,%eax
49: c3 ret

X86_32 after:
00000000 <bitrev32>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: 89 45 f8 mov %eax,-0x8(%ebp)
9: 0f b6 45 f8 movzbl -0x8(%ebp),%eax
d: 8a 80 00 00 00 00 mov 0x0(%eax),%al
13: 88 45 ff mov %al,-0x1(%ebp)
16: 0f b6 45 f9 movzbl -0x7(%ebp),%eax
1a: 8a 80 00 00 00 00 mov 0x0(%eax),%al
20: 88 45 fe mov %al,-0x2(%ebp)
23: 0f b6 45 fa movzbl -0x6(%ebp),%eax
27: 8a 80 00 00 00 00 mov 0x0(%eax),%al
2d: 88 45 fd mov %al,-0x3(%ebp)
30: 0f b6 45 fb movzbl -0x5(%ebp),%eax
34: 8a 80 00 00 00 00 mov 0x0(%eax),%al
3a: 88 45 fc mov %al,-0x4(%ebp)
3d: 8b 45 fc mov -0x4(%ebp),%eax
40: c9 leave
41: c3 ret

Signed-off-by: Harvey Harrison <harvey.harrison@xxxxxxxxx>
---
lib/bitrev.c | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/lib/bitrev.c b/lib/bitrev.c
index 989aff7..8367b91 100644
--- a/lib/bitrev.c
+++ b/lib/bitrev.c
@@ -42,17 +42,20 @@ const u8 byte_rev_table[256] = {
};
EXPORT_SYMBOL_GPL(byte_rev_table);

-static __always_inline u16 bitrev16(u16 x)
-{
- return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
-}
-
/**
* bitrev32 - reverse the order of bits in a u32 value
* @x: value to be bit-reversed
*/
u32 bitrev32(u32 x)
{
- return (bitrev16(x & 0xffff) << 16) | bitrev16(x >> 16);
+ u32 y;
+ u8 *yp = (u8 *)&y + 3;
+ u8 *xp = (u8 *)&x;
+
+ *yp-- = byte_rev_table[*xp++];
+ *yp-- = byte_rev_table[*xp++];
+ *yp-- = byte_rev_table[*xp++];
+ *yp-- = byte_rev_table[*xp++];
+ return y;
}
EXPORT_SYMBOL(bitrev32);
--
1.5.5.1.270.g89765



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/