Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
[linux-2.6] / 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 */