1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#ifndef _ALPHA_BYTEORDER_H
#define _ALPHA_BYTEORDER_H
#undef ntohl
#undef ntohs
#undef htonl
#undef htons
#ifndef __LITTLE_ENDIAN
#define __LITTLE_ENDIAN 1234
#endif
#ifndef __LITTLE_ENDIAN_BITFIELD
#define __LITTLE_ENDIAN_BITFIELD
#endif
#ifdef __KERNEL__
/*
* In-kernel byte order macros to handle stuff like
* byte-order-dependent filesystems etc.
*/
#define cpu_to_le32(x) (x)
#define le32_to_cpu(x) (x)
#define cpu_to_le16(x) (x)
#define le16_to_cpu(x) (x)
#define cpu_to_be32(x) htonl((x))
#define be32_to_cpu(x) ntohl((x))
#define cpu_to_be16(x) htons((x))
#define be16_to_cpu(x) ntohs((x))
#endif /* __KERNEL__ */
extern unsigned long int ntohl(unsigned long int);
extern unsigned short int ntohs(unsigned short int);
extern unsigned long int htonl(unsigned long int);
extern unsigned short int htons(unsigned short int);
extern unsigned long int __ntohl(unsigned long int);
extern unsigned short int __ntohs(unsigned short int);
#ifdef __GNUC__
extern unsigned long int __constant_ntohl(unsigned long int);
extern unsigned short int __constant_ntohs(unsigned short int);
/*
* The constant and non-constant versions here are the same.
* Maybe I'll come up with an alpha-optimized routine for the
* non-constant ones (the constant ones don't need it: gcc
* will optimize it to the correct constant)
*/
extern __inline__ unsigned long int
__ntohl(unsigned long int x)
{
unsigned long int res, t1, t2;
__asm__(
"# bswap input: %0 (aabbccdd)\n\t"
"# output: %0, used %1 %2\n\t"
"extlh %0,5,%1 # %1 = dd000000\n\t"
"zap %0,0xfd,%2 # %2 = 0000cc00\n\t"
"sll %2,5,%2 # %2 = 00198000\n\t"
"s8addq %2,%1,%1 # %1 = ddcc0000\n\t"
"zap %0,0xfb,%2 # %2 = 00bb0000\n\t"
"srl %2,8,%2 # %2 = 0000bb00\n\t"
"extbl %0,3,%0 # %0 = 000000aa\n\t"
"or %1,%0,%0 # %0 = ddcc00aa\n\t"
"or %2,%0,%0 # %0 = ddccbbaa\n"
: "r="(res), "r="(t1), "r="(t2)
: "0" (x & 0xffffffffUL));
return res;
}
#define __constant_ntohl(x) \
((unsigned long int)((((x) & 0x000000ffUL) << 24) | \
(((x) & 0x0000ff00UL) << 8) | \
(((x) & 0x00ff0000UL) >> 8) | \
(((x) & 0xff000000UL) >> 24)))
extern __inline__ unsigned short int
__ntohs(unsigned short int x)
{
unsigned long int res, t1;
__asm__(
"# v0 is result; swap in-place.\n\t"
"bis %2,%2,%0 # v0 = aabb\n\t"
"extwh %0,7,%1 # t1 = bb00\n\t"
"extbl %0,1,%0 # v0 = 00aa\n\t"
"bis %0,%1,%0 # v0 = bbaa\n"
: "r="(res), "r="(t1) : "r"(x));
return res;
}
#define __constant_ntohs(x) \
((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \
(((unsigned short int)(x) & 0xff00) >> 8)))
#define __htonl(x) __ntohl(x)
#define __htons(x) __ntohs(x)
#define __constant_htonl(x) __constant_ntohl(x)
#define __constant_htons(x) __constant_ntohs(x)
#ifdef __OPTIMIZE__
# define ntohl(x) \
(__builtin_constant_p((long)(x)) ? \
__constant_ntohl((x)) : \
__ntohl((x)))
# define ntohs(x) \
(__builtin_constant_p((short)(x)) ? \
__constant_ntohs((x)) : \
__ntohs((x)))
# define htonl(x) \
(__builtin_constant_p((long)(x)) ? \
__constant_htonl((x)) : \
__htonl((x)))
# define htons(x) \
(__builtin_constant_p((short)(x)) ? \
__constant_htons((x)) : \
__htons((x)))
#endif /* __OPTIMIZE__ */
#endif /* __GNUC__ */
#endif /* _ALPHA_BYTEORDER_H */
|