source: svn/trunk/newcon3bcm2_21bu/toolchain/mips-linux-uclibc/include/linux/byteorder/swabb.h

Last change on this file was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 3.1 KB
Line 
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#include <asm/types.h>
29
30#define ___swahw32(x) \
31({ \
32        __u32 __x = (x); \
33        ((__u32)( \
34                (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \
35                (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \
36})
37#define ___swahb32(x) \
38({ \
39        __u32 __x = (x); \
40        ((__u32)( \
41                (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \
42                (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \
43})
44
45#define ___constant_swahw32(x) \
46        ((__u32)( \
47                (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \
48                (((__u32)(x) & (__u32)0xffff0000UL) >> 16) ))
49#define ___constant_swahb32(x) \
50        ((__u32)( \
51                (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \
52                (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) ))
53
54/*
55 * provide defaults when no architecture-specific optimization is detected
56 */
57#ifndef __arch__swahw32
58#  define __arch__swahw32(x) ___swahw32(x)
59#endif
60#ifndef __arch__swahb32
61#  define __arch__swahb32(x) ___swahb32(x)
62#endif
63
64#ifndef __arch__swahw32p
65#  define __arch__swahw32p(x) __swahw32(*(x))
66#endif
67#ifndef __arch__swahb32p
68#  define __arch__swahb32p(x) __swahb32(*(x))
69#endif
70
71#ifndef __arch__swahw32s
72#  define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0)
73#endif
74#ifndef __arch__swahb32s
75#  define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0)
76#endif
77
78
79/*
80 * Allow constant folding
81 */
82#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__)
83#  define __swahw32(x) \
84(__builtin_constant_p((__u32)(x)) ? \
85 ___swahw32((x)) : \
86 __fswahw32((x)))
87#  define __swahb32(x) \
88(__builtin_constant_p((__u32)(x)) ? \
89 ___swahb32((x)) : \
90 __fswahb32((x)))
91#else
92#  define __swahw32(x) __fswahw32(x)
93#  define __swahb32(x) __fswahb32(x)
94#endif /* OPTIMIZE */
95
96
97static __inline__ __const__ __u32 __fswahw32(__u32 x)
98{
99        return __arch__swahw32(x);
100}
101static __inline__ __u32 __swahw32p(__u32 *x)
102{
103        return __arch__swahw32p(x);
104}
105static __inline__ void __swahw32s(__u32 *addr)
106{
107        __arch__swahw32s(addr);
108}
109
110
111static __inline__ __const__ __u32 __fswahb32(__u32 x)
112{
113        return __arch__swahb32(x);
114}
115static __inline__ __u32 __swahb32p(__u32 *x)
116{
117        return __arch__swahb32p(x);
118}
119static __inline__ void __swahb32s(__u32 *addr)
120{
121        __arch__swahb32s(addr);
122}
123
124#ifdef __BYTEORDER_HAS_U64__
125/*
126 * Not supported yet
127 */
128#endif /* __BYTEORDER_HAS_U64__ */
129
130#endif /* _LINUX_BYTEORDER_SWABB_H */
Note: See TracBrowser for help on using the repository browser.