blob: 2cc35a0e188e1712def6878400af75694d5b92e4 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#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__
17static __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
27static __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
37static __inline__ void ___arch__swab64s(__u64 *x)
38{
39 *x = ___arch__swab64p(x);
40}
41#endif /* __s390x__ */
42
43static __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
61static __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
75static __inline__ void ___arch__swab32s(__u32 *x)
76{
77 *x = ___arch__swab32p(x);
78}
79
80static __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
96static __inline__ __u16 ___arch__swab16(__u16 x)
97{
98 return ___arch__swab16p(&x);
99}
100
101static __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 */