Linux v2.6.16-rc1
[linux-2.6/next.git] / include / asm-s390 / byteorder.h
blob2cc35a0e188e1712def6878400af75694d5b92e4
1 #ifndef _S390_BYTEORDER_H
2 #define _S390_BYTEORDER_H
4 /*
5 * include/asm-s390/byteorder.h
7 * S390 version
8 * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
9 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
12 #include <asm/types.h>
14 #ifdef __GNUC__
16 #ifdef __s390x__
17 static __inline__ __u64 ___arch__swab64p(const __u64 *x)
19 __u64 result;
21 __asm__ __volatile__ (
22 " lrvg %0,%1"
23 : "=d" (result) : "m" (*x) );
24 return result;
27 static __inline__ __u64 ___arch__swab64(__u64 x)
29 __u64 result;
31 __asm__ __volatile__ (
32 " lrvgr %0,%1"
33 : "=d" (result) : "d" (x) );
34 return result;
37 static __inline__ void ___arch__swab64s(__u64 *x)
39 *x = ___arch__swab64p(x);
41 #endif /* __s390x__ */
43 static __inline__ __u32 ___arch__swab32p(const __u32 *x)
45 __u32 result;
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;
61 static __inline__ __u32 ___arch__swab32(__u32 x)
63 #ifndef __s390x__
64 return ___arch__swab32p(&x);
65 #else /* __s390x__ */
66 __u32 result;
68 __asm__ __volatile__ (
69 " lrvr %0,%1"
70 : "=d" (result) : "d" (x) );
71 return result;
72 #endif /* __s390x__ */
75 static __inline__ void ___arch__swab32s(__u32 *x)
77 *x = ___arch__swab32p(x);
80 static __inline__ __u16 ___arch__swab16p(const __u16 *x)
82 __u16 result;
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;
96 static __inline__ __u16 ___arch__swab16(__u16 x)
98 return ___arch__swab16p(&x);
101 static __inline__ void ___arch__swab16s(__u16 *x)
103 *x = ___arch__swab16p(x);
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)
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__ */
127 #endif /* __GNUC__ */
129 #include <linux/byteorder/big_endian.h>
131 #endif /* _S390_BYTEORDER_H */