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