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(__mips_isa_rev) && (__mips_isa_rev >= 2)) || \ 17 defined(_MIPS_ARCH_LOONGSON3A) 18 19 static inline __attribute__((nomips16)) __attribute_const__ 20 __u16 __arch_swab16(__u16 x) 21 { 22 __asm__( 23 " .set push \n" 24 " .set arch=mips32r2 \n" 25 " .set nomips16 \n" 26 " wsbh %0, %1 \n" 27 " .set pop \n" 28 : "=r" (x) 29 : "r" (x)); 30 31 return x; 32 } 33 #define __arch_swab16 __arch_swab16 34 35 static inline __attribute__((nomips16)) __attribute_const__ 36 __u32 __arch_swab32(__u32 x) 37 { 38 __asm__( 39 " .set push \n" 40 " .set arch=mips32r2 \n" 41 " .set nomips16 \n" 42 " wsbh %0, %1 \n" 43 " rotr %0, %0, 16 \n" 44 " .set pop \n" 45 : "=r" (x) 46 : "r" (x)); 47 48 return x; 49 } 50 #define __arch_swab32 __arch_swab32 51 52 /* 53 * Having already checked for MIPS R2, enable the optimized version for 54 * 64-bit kernel on r2 CPUs. 55 */ 56 #ifdef __mips64 57 static inline __attribute__((nomips16)) __attribute_const__ 58 __u64 __arch_swab64(__u64 x) 59 { 60 __asm__( 61 " .set push \n" 62 " .set arch=mips64r2 \n" 63 " .set nomips16 \n" 64 " dsbh %0, %1 \n" 65 " dshd %0, %0 \n" 66 " .set pop \n" 67 : "=r" (x) 68 : "r" (x)); 69 70 return x; 71 } 72 #define __arch_swab64 __arch_swab64 73 #endif /* __mips64 */ 74 #endif /* MIPS R2 or newer or Loongson 3A */ 75 #endif /* _ASM_SWAB_H */ 76