| Harvey Harrison | 156ca2b | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 1 | #ifndef _ASM_POWERPC_SWAB_H | 
 | 2 | #define _ASM_POWERPC_SWAB_H | 
 | 3 |  | 
 | 4 | /* | 
 | 5 |  * This program is free software; you can redistribute it and/or | 
 | 6 |  * modify it under the terms of the GNU General Public License | 
 | 7 |  * as published by the Free Software Foundation; either version | 
 | 8 |  * 2 of the License, or (at your option) any later version. | 
 | 9 |  */ | 
 | 10 |  | 
| Jaswinder Singh Rajput | 4810987 | 2009-01-31 11:54:05 +0530 | [diff] [blame] | 11 | #include <linux/types.h> | 
| Harvey Harrison | 156ca2b | 2009-01-06 14:56:23 -0800 | [diff] [blame] | 12 | #include <linux/compiler.h> | 
 | 13 |  | 
 | 14 | #ifdef __GNUC__ | 
 | 15 |  | 
 | 16 | #ifndef __powerpc64__ | 
 | 17 | #define __SWAB_64_THRU_32__ | 
 | 18 | #endif /* __powerpc64__ */ | 
 | 19 |  | 
 | 20 | #ifdef __KERNEL__ | 
 | 21 |  | 
 | 22 | static __inline__ __u16 ld_le16(const volatile __u16 *addr) | 
 | 23 | { | 
 | 24 | 	__u16 val; | 
 | 25 |  | 
 | 26 | 	__asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); | 
 | 27 | 	return val; | 
 | 28 | } | 
 | 29 | #define __arch_swab16p ld_le16 | 
 | 30 |  | 
 | 31 | static __inline__ void st_le16(volatile __u16 *addr, const __u16 val) | 
 | 32 | { | 
 | 33 | 	__asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); | 
 | 34 | } | 
 | 35 |  | 
 | 36 | static inline void __arch_swab16s(__u16 *addr) | 
 | 37 | { | 
 | 38 | 	st_le16(addr, *addr); | 
 | 39 | } | 
 | 40 | #define __arch_swab16s __arch_swab16s | 
 | 41 |  | 
 | 42 | static __inline__ __u32 ld_le32(const volatile __u32 *addr) | 
 | 43 | { | 
 | 44 | 	__u32 val; | 
 | 45 |  | 
 | 46 | 	__asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); | 
 | 47 | 	return val; | 
 | 48 | } | 
 | 49 | #define __arch_swab32p ld_le32 | 
 | 50 |  | 
 | 51 | static __inline__ void st_le32(volatile __u32 *addr, const __u32 val) | 
 | 52 | { | 
 | 53 | 	__asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); | 
 | 54 | } | 
 | 55 |  | 
 | 56 | static inline void __arch_swab32s(__u32 *addr) | 
 | 57 | { | 
 | 58 | 	st_le32(addr, *addr); | 
 | 59 | } | 
 | 60 | #define __arch_swab32s __arch_swab32s | 
 | 61 |  | 
 | 62 | static inline __attribute_const__ __u16 __arch_swab16(__u16 value) | 
 | 63 | { | 
 | 64 | 	__u16 result; | 
 | 65 |  | 
 | 66 | 	__asm__("rlwimi %0,%1,8,16,23" | 
 | 67 | 	    : "=r" (result) | 
 | 68 | 	    : "r" (value), "0" (value >> 8)); | 
 | 69 | 	return result; | 
 | 70 | } | 
 | 71 | #define __arch_swab16 __arch_swab16 | 
 | 72 |  | 
 | 73 | static inline __attribute_const__ __u32 __arch_swab32(__u32 value) | 
 | 74 | { | 
 | 75 | 	__u32 result; | 
 | 76 |  | 
 | 77 | 	__asm__("rlwimi %0,%1,24,16,23\n\t" | 
 | 78 | 	    "rlwimi %0,%1,8,8,15\n\t" | 
 | 79 | 	    "rlwimi %0,%1,24,0,7" | 
 | 80 | 	    : "=r" (result) | 
 | 81 | 	    : "r" (value), "0" (value >> 24)); | 
 | 82 | 	return result; | 
 | 83 | } | 
 | 84 | #define __arch_swab32 __arch_swab32 | 
 | 85 |  | 
 | 86 | #endif /* __KERNEL__ */ | 
 | 87 |  | 
 | 88 | #endif /* __GNUC__ */ | 
 | 89 |  | 
 | 90 | #endif /* _ASM_POWERPC_SWAB_H */ |