Trent Piepho 8e2c20023f 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>
2007-05-08 11:14:59 -07:00
..
2007-05-01 16:11:57 +02:00
2007-05-07 12:12:58 -07:00
2007-04-30 22:17:15 -07:00
2006-12-04 02:00:22 -05:00
2007-02-20 17:10:15 -08:00
2006-12-08 08:28:39 -08:00
2006-12-07 08:39:20 -08:00
2007-05-07 12:12:55 -07:00
2006-12-08 08:28:39 -08:00
2007-01-30 08:26:45 -08:00
2007-02-20 17:10:14 -08:00
2007-05-07 12:13:00 -07:00
2007-05-07 12:13:00 -07:00
2007-04-27 10:57:31 -07:00
2006-12-07 08:39:25 -08:00
2007-05-01 09:11:12 +01:00
2007-02-09 17:39:36 -05:00
2007-02-11 11:18:07 -08:00
2007-02-01 16:17:06 -08:00
2007-05-07 12:12:58 -07:00
2007-05-03 13:17:25 -07:00
2007-03-27 09:05:15 -07:00
2007-05-06 20:38:28 -04:00
2006-12-07 08:39:32 -08:00
2006-12-10 09:55:41 -08:00
2007-04-28 11:01:07 -04:00
2007-04-19 14:56:12 +02:00
2007-03-16 00:59:29 -04:00
2007-04-07 10:03:43 -07:00
2006-12-10 21:21:29 +01:00
2007-05-01 23:26:34 +02:00
2007-05-05 22:03:49 +02:00
2007-04-25 22:30:01 -07:00
2007-04-25 22:29:10 -07:00
2007-04-25 22:24:41 -07:00
2007-04-25 22:29:10 -07:00
2007-05-07 12:12:59 -07:00
2006-12-07 08:39:47 -08:00
2006-12-07 08:39:47 -08:00
2006-12-07 08:39:47 -08:00
2007-03-01 14:53:38 -08:00
2006-12-08 08:28:57 -08:00
2007-04-25 22:25:52 -07:00
2007-04-30 16:40:39 -07:00
2007-05-03 10:52:22 +03:00
2007-05-07 12:13:00 -07:00
2007-02-16 14:37:06 +00:00
2007-04-25 22:29:49 -07:00
2007-05-03 10:52:32 +03:00
2007-02-17 19:17:37 +01:00
2007-05-03 10:52:22 +03:00
2007-05-07 12:12:53 -07:00
2007-01-23 00:34:54 -05:00
2007-05-04 17:59:07 -07:00
2007-05-07 12:12:59 -07:00
2007-05-05 14:15:32 -07:00
2007-03-12 16:31:50 -07:00
2007-03-27 08:55:47 +02:00
2007-04-17 16:36:26 -07:00
2007-04-30 16:40:41 -07:00
2007-02-11 10:51:28 -08:00
2007-05-08 11:14:57 -07:00
2006-12-04 02:00:36 -05:00
2007-01-11 18:18:21 -08:00
2007-05-07 12:12:54 -07:00
2007-02-11 10:51:28 -08:00
2006-12-22 08:55:49 -08:00
2006-12-10 09:55:40 -08:00
2006-12-07 08:39:35 -08:00
2007-05-07 12:12:58 -07:00
2007-05-07 12:12:50 -07:00
2007-05-03 03:16:20 -07:00
2007-05-07 12:12:54 -07:00
2007-02-20 17:10:14 -08:00
2007-02-20 17:10:14 -08:00
2007-05-08 11:14:58 -07:00
2007-05-07 12:12:59 -07:00
2007-02-12 09:48:41 -08:00
2007-02-11 10:51:18 -08:00
2007-02-20 17:10:13 -08:00
2007-02-07 14:03:19 +11:00
2007-02-16 08:13:57 -08:00
2007-02-16 08:13:56 -08:00
2007-03-05 07:57:51 -08:00
2006-12-15 08:47:51 -08:00
2007-05-07 12:12:58 -07:00
2007-02-11 10:51:25 -08:00
2007-02-11 11:18:05 -08:00
2007-05-04 12:55:39 -07:00