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