1 : #ifndef _I386_BYTEORDER_H
2 : #define _I386_BYTEORDER_H
3 :
4 : #include <asm/types.h>
5 :
6 : #ifdef __GNUC__
7 :
8 : /* For avoiding bswap on i386 */
9 :
10 0 : static __inline__ __u32 ___arch__swab32(__u32 x)
11 : {
12 : #ifdef CONFIG_X86_BSWAP
13 : __asm__("bswap %0" : "=r" (x) : "0" (x));
14 : #else
15 : __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
16 : "rorl $16,%0\n\t" /* swap words */
17 : "xchgb %b0,%h0" /* swap higher bytes */
18 : :"=q" (x)
19 0 : : "0" (x));
20 : #endif
21 0 : return x;
22 : }
23 :
24 0 : static __inline__ __u64 ___arch__swab64(__u64 val)
25 : {
26 : union {
27 : struct { __u32 a,b; } s;
28 : __u64 u;
29 : } v;
30 0 : v.u = val;
31 : #ifdef CONFIG_X86_BSWAP
32 : asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
33 : : "=r" (v.s.a), "=r" (v.s.b)
34 : : "0" (v.s.a), "1" (v.s.b));
35 : #else
36 0 : v.s.a = ___arch__swab32(v.s.a);
37 0 : v.s.b = ___arch__swab32(v.s.b);
38 0 : asm("xchgl %0,%1" : "=r" (v.s.a), "=r" (v.s.b) : "0" (v.s.a), "1" (v.s.b));
39 : #endif
40 0 : return v.u;
41 : }
42 :
43 : /* Do not define swab16. Gcc is smart enough to recognize "C" version and
44 : convert it into rotation or exhange. */
45 :
46 : #define __arch__swab64(x) ___arch__swab64(x)
47 : #define __arch__swab32(x) ___arch__swab32(x)
48 :
49 : #define __BYTEORDER_HAS_U64__
50 :
51 : #endif /* __GNUC__ */
52 :
53 : #include <linux/byteorder/little_endian.h>
54 :
55 : #endif /* _I386_BYTEORDER_H */
|