| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This file is subject to the terms and conditions of the GNU General Public | 
					
						
							|  |  |  |  * License.  See the file "COPYING" in the main directory of this archive | 
					
						
							|  |  |  |  * for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 1996, 99, 2003 by Ralf Baechle | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef _ASM_SWAB_H
 | 
					
						
							|  |  |  | #define _ASM_SWAB_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/compiler.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-31 11:23:37 +05:30
										 |  |  | #include <linux/types.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define __SWAB_64_THRU_32__
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 16:56:58 +08:00
										 |  |  | #if (defined(__mips_isa_rev) && (__mips_isa_rev >= 2)) ||		\
 | 
					
						
							|  |  |  |     defined(_MIPS_ARCH_LOONGSON3A) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static inline __attribute_const__ __u16 __arch_swab16(__u16 x) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__asm__( | 
					
						
							| 
									
										
										
										
											2014-08-15 16:56:58 +08:00
										 |  |  | 	"	.set	push			\n" | 
					
						
							|  |  |  | 	"	.set	arch=mips32r2		\n" | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | 	"	wsbh	%0, %1			\n" | 
					
						
							| 
									
										
										
										
											2014-08-15 16:56:58 +08:00
										 |  |  | 	"	.set	pop			\n" | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | 	: "=r" (x) | 
					
						
							|  |  |  | 	: "r" (x)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return x; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #define __arch_swab16 __arch_swab16
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__asm__( | 
					
						
							| 
									
										
										
										
											2014-08-15 16:56:58 +08:00
										 |  |  | 	"	.set	push			\n" | 
					
						
							|  |  |  | 	"	.set	arch=mips32r2		\n" | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | 	"	wsbh	%0, %1			\n" | 
					
						
							|  |  |  | 	"	rotr	%0, %0, 16		\n" | 
					
						
							| 
									
										
										
										
											2014-08-15 16:56:58 +08:00
										 |  |  | 	"	.set	pop			\n" | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | 	: "=r" (x) | 
					
						
							|  |  |  | 	: "r" (x)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return x; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #define __arch_swab32 __arch_swab32
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-29 09:54:15 -07:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:52 +02:00
										 |  |  |  * Having already checked for MIPS R2, enable the optimized version for | 
					
						
							|  |  |  |  * 64-bit kernel on r2 CPUs. | 
					
						
							| 
									
										
										
										
											2009-06-29 09:54:15 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:52 +02:00
										 |  |  | #ifdef __mips64
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | static inline __attribute_const__ __u64 __arch_swab64(__u64 x) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__asm__( | 
					
						
							| 
									
										
										
										
											2014-08-15 16:56:58 +08:00
										 |  |  | 	"	.set	push			\n" | 
					
						
							|  |  |  | 	"	.set	arch=mips64r2		\n" | 
					
						
							|  |  |  | 	"	dsbh	%0, %1			\n" | 
					
						
							|  |  |  | 	"	dshd	%0, %0			\n" | 
					
						
							|  |  |  | 	"	.set	pop			\n" | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | 	: "=r" (x) | 
					
						
							|  |  |  | 	: "r" (x)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return x; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #define __arch_swab64 __arch_swab64
 | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:52 +02:00
										 |  |  | #endif /* __mips64 */
 | 
					
						
							| 
									
										
										
										
											2014-08-15 16:56:58 +08:00
										 |  |  | #endif /* MIPS R2 or newer or Loongson 3A */
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:56:23 -08:00
										 |  |  | #endif /* _ASM_SWAB_H */
 |