1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 1996, 99, 2003 by Ralf Baechle 7 */ 8 #ifndef _ASM_SWAB_H 9 #define _ASM_SWAB_H 10 11 #include <linux/compiler.h> 12 #include <linux/types.h> 13 14 #define __SWAB_64_THRU_32__ 15 16 #if !defined(__mips16) && \ 17 ((defined(__mips_isa_rev) && (__mips_isa_rev >= 2)) || \ 18 defined(_MIPS_ARCH_LOONGSON3A)) 19 20 static inline __attribute_const__ __u16 __arch_swab16(__u16 x) 21 { 22 __asm__( 23 " .set push \n" 24 " .set arch=mips32r2 \n" 25 " wsbh %0, %1 \n" 26 " .set pop \n" 27 : "=r" (x) 28 : "r" (x)); 29 30 return x; 31 } 32 #define __arch_swab16 __arch_swab16 33 34 static inline __attribute_const__ __u32 __arch_swab32(__u32 x) 35 { 36 __asm__( 37 " .set push \n" 38 " .set arch=mips32r2 \n" 39 " wsbh %0, %1 \n" 40 " rotr %0, %0, 16 \n" 41 " .set pop \n" 42 : "=r" (x) 43 : "r" (x)); 44 45 return x; 46 } 47 #define __arch_swab32 __arch_swab32 48 49 /* 50 * Having already checked for MIPS R2, enable the optimized version for 51 * 64-bit kernel on r2 CPUs. 52 */ 53 #ifdef __mips64 54 static inline __attribute_const__ __u64 __arch_swab64(__u64 x) 55 { 56 __asm__( 57 " .set push \n" 58 " .set arch=mips64r2 \n" 59 " dsbh %0, %1 \n" 60 " dshd %0, %0 \n" 61 " .set pop \n" 62 : "=r" (x) 63 : "r" (x)); 64 65 return x; 66 } 67 #define __arch_swab64 __arch_swab64 68 #endif /* __mips64 */ 69 #endif /* (not __mips16) and (MIPS R2 or newer or Loongson 3A) */ 70 #endif /* _ASM_SWAB_H */ 71