Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 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> |
Jaswinder Singh Rajput | a9f6acc | 2009-01-31 11:23:37 +0530 | [diff] [blame] | 12 | #include <linux/types.h> |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 13 | |
| 14 | #define __SWAB_64_THRU_32__ |
| 15 | |
Chen Jie | 3c09bae | 2014-08-15 16:56:58 +0800 | [diff] [blame] | 16 | #if (defined(__mips_isa_rev) && (__mips_isa_rev >= 2)) || \ |
| 17 | defined(_MIPS_ARCH_LOONGSON3A) |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 18 | |
| 19 | static inline __attribute_const__ __u16 __arch_swab16(__u16 x) |
| 20 | { |
| 21 | __asm__( |
Chen Jie | 3c09bae | 2014-08-15 16:56:58 +0800 | [diff] [blame] | 22 | " .set push \n" |
| 23 | " .set arch=mips32r2 \n" |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 24 | " wsbh %0, %1 \n" |
Chen Jie | 3c09bae | 2014-08-15 16:56:58 +0800 | [diff] [blame] | 25 | " .set pop \n" |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 26 | : "=r" (x) |
| 27 | : "r" (x)); |
| 28 | |
| 29 | return x; |
| 30 | } |
| 31 | #define __arch_swab16 __arch_swab16 |
| 32 | |
| 33 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) |
| 34 | { |
| 35 | __asm__( |
Chen Jie | 3c09bae | 2014-08-15 16:56:58 +0800 | [diff] [blame] | 36 | " .set push \n" |
| 37 | " .set arch=mips32r2 \n" |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 38 | " wsbh %0, %1 \n" |
| 39 | " rotr %0, %0, 16 \n" |
Chen Jie | 3c09bae | 2014-08-15 16:56:58 +0800 | [diff] [blame] | 40 | " .set pop \n" |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 41 | : "=r" (x) |
| 42 | : "r" (x)); |
| 43 | |
| 44 | return x; |
| 45 | } |
| 46 | #define __arch_swab32 __arch_swab32 |
| 47 | |
David Daney | b53d4d1 | 2009-06-29 09:54:15 -0700 | [diff] [blame] | 48 | /* |
Ralf Baechle | cfb9a4e | 2013-06-12 21:06:52 +0200 | [diff] [blame] | 49 | * Having already checked for MIPS R2, enable the optimized version for |
| 50 | * 64-bit kernel on r2 CPUs. |
David Daney | b53d4d1 | 2009-06-29 09:54:15 -0700 | [diff] [blame] | 51 | */ |
Ralf Baechle | cfb9a4e | 2013-06-12 21:06:52 +0200 | [diff] [blame] | 52 | #ifdef __mips64 |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 53 | static inline __attribute_const__ __u64 __arch_swab64(__u64 x) |
| 54 | { |
| 55 | __asm__( |
Chen Jie | 3c09bae | 2014-08-15 16:56:58 +0800 | [diff] [blame] | 56 | " .set push \n" |
| 57 | " .set arch=mips64r2 \n" |
| 58 | " dsbh %0, %1 \n" |
| 59 | " dshd %0, %0 \n" |
| 60 | " .set pop \n" |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 61 | : "=r" (x) |
| 62 | : "r" (x)); |
| 63 | |
| 64 | return x; |
| 65 | } |
| 66 | #define __arch_swab64 __arch_swab64 |
Ralf Baechle | cfb9a4e | 2013-06-12 21:06:52 +0200 | [diff] [blame] | 67 | #endif /* __mips64 */ |
Chen Jie | 3c09bae | 2014-08-15 16:56:58 +0800 | [diff] [blame] | 68 | #endif /* MIPS R2 or newer or Loongson 3A */ |
Harvey Harrison | 8cdd3a9 | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 69 | #endif /* _ASM_SWAB_H */ |