xref: /rk3399_rockchip-uboot/arch/mips/include/asm/byteorder.h (revision 819833af39a91fa1c1e8252862bbda6f5a602f7b)
1*819833afSPeter Tyser /*
2*819833afSPeter Tyser  * This file is subject to the terms and conditions of the GNU General Public
3*819833afSPeter Tyser  * License.  See the file "COPYING" in the main directory of this archive
4*819833afSPeter Tyser  * for more details.
5*819833afSPeter Tyser  *
6*819833afSPeter Tyser  * Copyright (C) 1996, 99, 2003 by Ralf Baechle
7*819833afSPeter Tyser  */
8*819833afSPeter Tyser #ifndef _ASM_BYTEORDER_H
9*819833afSPeter Tyser #define _ASM_BYTEORDER_H
10*819833afSPeter Tyser 
11*819833afSPeter Tyser #include <asm/types.h>
12*819833afSPeter Tyser 
13*819833afSPeter Tyser #ifdef __GNUC__
14*819833afSPeter Tyser 
15*819833afSPeter Tyser #ifdef CONFIG_CPU_MIPSR2
16*819833afSPeter Tyser 
17*819833afSPeter Tyser static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
18*819833afSPeter Tyser {
19*819833afSPeter Tyser 	__asm__(
20*819833afSPeter Tyser 	"	wsbh	%0, %1			\n"
21*819833afSPeter Tyser 	: "=r" (x)
22*819833afSPeter Tyser 	: "r" (x));
23*819833afSPeter Tyser 
24*819833afSPeter Tyser 	return x;
25*819833afSPeter Tyser }
26*819833afSPeter Tyser #define __arch__swab16(x)	___arch__swab16(x)
27*819833afSPeter Tyser 
28*819833afSPeter Tyser static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
29*819833afSPeter Tyser {
30*819833afSPeter Tyser 	__asm__(
31*819833afSPeter Tyser 	"	wsbh	%0, %1			\n"
32*819833afSPeter Tyser 	"	rotr	%0, %0, 16		\n"
33*819833afSPeter Tyser 	: "=r" (x)
34*819833afSPeter Tyser 	: "r" (x));
35*819833afSPeter Tyser 
36*819833afSPeter Tyser 	return x;
37*819833afSPeter Tyser }
38*819833afSPeter Tyser #define __arch__swab32(x)	___arch__swab32(x)
39*819833afSPeter Tyser 
40*819833afSPeter Tyser #ifdef CONFIG_CPU_MIPS64_R2
41*819833afSPeter Tyser 
42*819833afSPeter Tyser static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
43*819833afSPeter Tyser {
44*819833afSPeter Tyser 	__asm__(
45*819833afSPeter Tyser 	"	dsbh	%0, %1			\n"
46*819833afSPeter Tyser 	"	dshd	%0, %0			\n"
47*819833afSPeter Tyser 	"	drotr	%0, %0, 32		\n"
48*819833afSPeter Tyser 	: "=r" (x)
49*819833afSPeter Tyser 	: "r" (x));
50*819833afSPeter Tyser 
51*819833afSPeter Tyser 	return x;
52*819833afSPeter Tyser }
53*819833afSPeter Tyser 
54*819833afSPeter Tyser #define __arch__swab64(x)	___arch__swab64(x)
55*819833afSPeter Tyser 
56*819833afSPeter Tyser #endif /* CONFIG_CPU_MIPS64_R2 */
57*819833afSPeter Tyser 
58*819833afSPeter Tyser #endif /* CONFIG_CPU_MIPSR2 */
59*819833afSPeter Tyser 
60*819833afSPeter Tyser #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
61*819833afSPeter Tyser #  define __BYTEORDER_HAS_U64__
62*819833afSPeter Tyser #  define __SWAB_64_THRU_32__
63*819833afSPeter Tyser #endif
64*819833afSPeter Tyser 
65*819833afSPeter Tyser #endif /* __GNUC__ */
66*819833afSPeter Tyser 
67*819833afSPeter Tyser #if defined(__MIPSEB__)
68*819833afSPeter Tyser #  include <linux/byteorder/big_endian.h>
69*819833afSPeter Tyser #elif defined(__MIPSEL__)
70*819833afSPeter Tyser #  include <linux/byteorder/little_endian.h>
71*819833afSPeter Tyser #else
72*819833afSPeter Tyser #  error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???"
73*819833afSPeter Tyser #endif
74*819833afSPeter Tyser 
75*819833afSPeter Tyser #endif /* _ASM_BYTEORDER_H */
76