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 20static 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 34static 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 54static 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