Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
424 | giacomo | 1 | #ifndef _LINUX_BYTEORDER_SWABB_H |
2 | #define _LINUX_BYTEORDER_SWABB_H |
||
3 | |||
4 | /* |
||
5 | * linux/byteorder/swabb.h |
||
6 | * SWAp Bytes Bizarrely |
||
7 | * swaHHXX[ps]?(foo) |
||
8 | * |
||
9 | * Support for obNUXIous pdp-endian and other bizarre architectures. |
||
10 | * Will Linux ever run on such ancient beasts? if not, this file |
||
11 | * will be but a programming pearl. Still, it's a reminder that we |
||
12 | * shouldn't be making too many assumptions when trying to be portable. |
||
13 | * |
||
14 | */ |
||
15 | |||
16 | /* |
||
17 | * Meaning of the names I chose (vaxlinux people feel free to correct them): |
||
18 | * swahw32 swap 16-bit half-words in a 32-bit word |
||
19 | * swahb32 swap 8-bit halves of each 16-bit half-word in a 32-bit word |
||
20 | * |
||
21 | * No 64-bit support yet. I don't know NUXI conventions for long longs. |
||
22 | * I guarantee it will be a mess when it's there, though :-> |
||
23 | * It will be even worse if there are conflicting 64-bit conventions. |
||
24 | * Hopefully, no one ever used 64-bit objects on NUXI machines. |
||
25 | * |
||
26 | */ |
||
27 | |||
28 | #define ___swahw32(x) \ |
||
29 | ({ \ |
||
30 | __u32 __x = (x); \ |
||
31 | ((__u32)( \ |
||
32 | (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \ |
||
33 | (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \ |
||
34 | }) |
||
35 | #define ___swahb32(x) \ |
||
36 | ({ \ |
||
37 | __u32 __x = (x); \ |
||
38 | ((__u32)( \ |
||
39 | (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \ |
||
40 | (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \ |
||
41 | }) |
||
42 | |||
43 | #define ___constant_swahw32(x) \ |
||
44 | ((__u32)( \ |
||
45 | (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ |
||
46 | (((__u32)(x) & (__u32)0xffff0000UL) >> 16) )) |
||
47 | #define ___constant_swahb32(x) \ |
||
48 | ((__u32)( \ |
||
49 | (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ |
||
50 | (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) )) |
||
51 | |||
52 | /* |
||
53 | * provide defaults when no architecture-specific optimization is detected |
||
54 | */ |
||
55 | #ifndef __arch__swahw32 |
||
56 | # define __arch__swahw32(x) ___swahw32(x) |
||
57 | #endif |
||
58 | #ifndef __arch__swahb32 |
||
59 | # define __arch__swahb32(x) ___swahb32(x) |
||
60 | #endif |
||
61 | |||
62 | #ifndef __arch__swahw32p |
||
63 | # define __arch__swahw32p(x) __swahw32(*(x)) |
||
64 | #endif |
||
65 | #ifndef __arch__swahb32p |
||
66 | # define __arch__swahb32p(x) __swahb32(*(x)) |
||
67 | #endif |
||
68 | |||
69 | #ifndef __arch__swahw32s |
||
70 | # define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0) |
||
71 | #endif |
||
72 | #ifndef __arch__swahb32s |
||
73 | # define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0) |
||
74 | #endif |
||
75 | |||
76 | |||
77 | /* |
||
78 | * Allow constant folding |
||
79 | */ |
||
80 | #if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) |
||
81 | # define __swahw32(x) \ |
||
82 | (__builtin_constant_p((__u32)(x)) ? \ |
||
83 | ___swahw32((x)) : \ |
||
84 | __fswahw32((x))) |
||
85 | # define __swahb32(x) \ |
||
86 | (__builtin_constant_p((__u32)(x)) ? \ |
||
87 | ___swahb32((x)) : \ |
||
88 | __fswahb32((x))) |
||
89 | #else |
||
90 | # define __swahw32(x) __fswahw32(x) |
||
91 | # define __swahb32(x) __fswahb32(x) |
||
92 | #endif /* OPTIMIZE */ |
||
93 | |||
94 | |||
95 | static __inline__ __const__ __u32 __fswahw32(__u32 x) |
||
96 | { |
||
97 | return __arch__swahw32(x); |
||
98 | } |
||
99 | static __inline__ __u32 __swahw32p(__u32 *x) |
||
100 | { |
||
101 | return __arch__swahw32p(x); |
||
102 | } |
||
103 | static __inline__ void __swahw32s(__u32 *addr) |
||
104 | { |
||
105 | __arch__swahw32s(addr); |
||
106 | } |
||
107 | |||
108 | |||
109 | static __inline__ __const__ __u32 __fswahb32(__u32 x) |
||
110 | { |
||
111 | return __arch__swahb32(x); |
||
112 | } |
||
113 | static __inline__ __u32 __swahb32p(__u32 *x) |
||
114 | { |
||
115 | return __arch__swahb32p(x); |
||
116 | } |
||
117 | static __inline__ void __swahb32s(__u32 *addr) |
||
118 | { |
||
119 | __arch__swahb32s(addr); |
||
120 | } |
||
121 | |||
122 | #ifdef __BYTEORDER_HAS_U64__ |
||
123 | /* |
||
124 | * Not supported yet |
||
125 | */ |
||
126 | #endif /* __BYTEORDER_HAS_U64__ */ |
||
127 | |||
128 | #if defined(__KERNEL__) |
||
129 | #define swahw32 __swahw32 |
||
130 | #define swahb32 __swahb32 |
||
131 | #define swahw32p __swahw32p |
||
132 | #define swahb32p __swahb32p |
||
133 | #define swahw32s __swahw32s |
||
134 | #define swahb32s __swahb32s |
||
135 | #endif |
||
136 | |||
137 | #endif /* _LINUX_BYTEORDER_SWABB_H */ |