1 #ifndef _BLACKFIN_SWAB_H 2 #define _BLACKFIN_SWAB_H 3 4 #include <asm/types.h> 5 #include <linux/compiler.h> 6 7 #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) 8 # define __SWAB_64_THRU_32__ 9 #endif 10 11 #ifdef __GNUC__ 12 __arch_swahb32(__u32 xx)13static __inline__ __attribute_const__ __u32 __arch_swahb32(__u32 xx) 14 { 15 __u32 tmp; 16 __asm__("%1 = %0 >> 8 (V);\n\t" 17 "%0 = %0 << 8 (V);\n\t" 18 "%0 = %0 | %1;\n\t" 19 : "+d"(xx), "=&d"(tmp)); 20 return xx; 21 } 22 #define __arch_swahb32 __arch_swahb32 23 __arch_swahw32(__u32 xx)24static __inline__ __attribute_const__ __u32 __arch_swahw32(__u32 xx) 25 { 26 __u32 rv; 27 __asm__("%0 = PACK(%1.L, %1.H);\n\t": "=d"(rv): "d"(xx)); 28 return rv; 29 } 30 #define __arch_swahw32 __arch_swahw32 31 __arch_swab32(__u32 xx)32static __inline__ __attribute_const__ __u32 __arch_swab32(__u32 xx) 33 { 34 return __arch_swahb32(__arch_swahw32(xx)); 35 } 36 #define __arch_swab32 __arch_swab32 37 __arch_swab16(__u16 xx)38static __inline__ __attribute_const__ __u16 __arch_swab16(__u16 xx) 39 { 40 __u32 xw = xx; 41 __asm__("%0 <<= 8;\n %0.L = %0.L + %0.H (NS);\n": "+d"(xw)); 42 return (__u16)xw; 43 } 44 #define __arch_swab16 __arch_swab16 45 46 #endif /* __GNUC__ */ 47 48 #endif /* _BLACKFIN_SWAB_H */ 49