Linux-2.6.12-rc2
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / asm-s390 / byteorder.h
1 #ifndef _S390_BYTEORDER_H
2 #define _S390_BYTEORDER_H
3
4 /*
5 * include/asm-s390/byteorder.h
6 *
7 * S390 version
8 * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
9 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
10 */
11
12 #include <asm/types.h>
13
14 #ifdef __GNUC__
15
16 #ifdef __s390x__
17 static __inline__ __u64 ___arch__swab64p(const __u64 *x)
18 {
19 __u64 result;
20
21 __asm__ __volatile__ (
22 " lrvg %0,%1"
23 : "=d" (result) : "m" (*x) );
24 return result;
25 }
26
27 static __inline__ __u64 ___arch__swab64(__u64 x)
28 {
29 __u64 result;
30
31 __asm__ __volatile__ (
32 " lrvgr %0,%1"
33 : "=d" (result) : "d" (x) );
34 return result;
35 }
36
37 static __inline__ void ___arch__swab64s(__u64 *x)
38 {
39 *x = ___arch__swab64p(x);
40 }
41 #endif /* __s390x__ */
42
43 static __inline__ __u32 ___arch__swab32p(const __u32 *x)
44 {
45 __u32 result;
46
47 __asm__ __volatile__ (
48 #ifndef __s390x__
49 " icm %0,8,3(%1)\n"
50 " icm %0,4,2(%1)\n"
51 " icm %0,2,1(%1)\n"
52 " ic %0,0(%1)"
53 : "=&d" (result) : "a" (x), "m" (*x) : "cc" );
54 #else /* __s390x__ */
55 " lrv %0,%1"
56 : "=d" (result) : "m" (*x) );
57 #endif /* __s390x__ */
58 return result;
59 }
60
61 static __inline__ __u32 ___arch__swab32(__u32 x)
62 {
63 #ifndef __s390x__
64 return ___arch__swab32p(&x);
65 #else /* __s390x__ */
66 __u32 result;
67
68 __asm__ __volatile__ (
69 " lrvr %0,%1"
70 : "=d" (result) : "d" (x) );
71 return result;
72 #endif /* __s390x__ */
73 }
74
75 static __inline__ void ___arch__swab32s(__u32 *x)
76 {
77 *x = ___arch__swab32p(x);
78 }
79
80 static __inline__ __u16 ___arch__swab16p(const __u16 *x)
81 {
82 __u16 result;
83
84 __asm__ __volatile__ (
85 #ifndef __s390x__
86 " icm %0,2,1(%1)\n"
87 " ic %0,0(%1)\n"
88 : "=&d" (result) : "a" (x), "m" (*x) : "cc" );
89 #else /* __s390x__ */
90 " lrvh %0,%1"
91 : "=d" (result) : "m" (*x) );
92 #endif /* __s390x__ */
93 return result;
94 }
95
96 static __inline__ __u16 ___arch__swab16(__u16 x)
97 {
98 return ___arch__swab16p(&x);
99 }
100
101 static __inline__ void ___arch__swab16s(__u16 *x)
102 {
103 *x = ___arch__swab16p(x);
104 }
105
106 #ifdef __s390x__
107 #define __arch__swab64(x) ___arch__swab64(x)
108 #define __arch__swab64p(x) ___arch__swab64p(x)
109 #define __arch__swab64s(x) ___arch__swab64s(x)
110 #endif /* __s390x__ */
111 #define __arch__swab32(x) ___arch__swab32(x)
112 #define __arch__swab16(x) ___arch__swab16(x)
113 #define __arch__swab32p(x) ___arch__swab32p(x)
114 #define __arch__swab16p(x) ___arch__swab16p(x)
115 #define __arch__swab32s(x) ___arch__swab32s(x)
116 #define __arch__swab16s(x) ___arch__swab16s(x)
117
118 #ifndef __s390x__
119 #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
120 # define __BYTEORDER_HAS_U64__
121 # define __SWAB_64_THRU_32__
122 #endif
123 #else /* __s390x__ */
124 #define __BYTEORDER_HAS_U64__
125 #endif /* __s390x__ */
126
127 #endif /* __GNUC__ */
128
129 #include <linux/byteorder/big_endian.h>
130
131 #endif /* _S390_BYTEORDER_H */