avr32: Work around byteswap bug in gcc < 4.2
[linux-2.6.git] / include / asm-avr32 / byteorder.h
1 /*
2  * AVR32 endian-conversion functions.
3  */
4 #ifndef __ASM_AVR32_BYTEORDER_H
5 #define __ASM_AVR32_BYTEORDER_H
6
7 #include <asm/types.h>
8 #include <linux/compiler.h>
9
10 #ifdef __CHECKER__
11 extern unsigned long __builtin_bswap_32(unsigned long x);
12 extern unsigned short __builtin_bswap_16(unsigned short x);
13 #endif
14
15 /*
16  * avr32-linux-gcc versions earlier than 4.2 improperly sign-extends
17  * the result.
18  */
19 #if !(__GNUC__ == 4 && __GNUC_MINOR__ < 2)
20 #define __arch__swab32(x) __builtin_bswap_32(x)
21 #define __arch__swab16(x) __builtin_bswap_16(x)
22 #endif
23
24 #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
25 # define __BYTEORDER_HAS_U64__
26 # define __SWAB_64_THRU_32__
27 #endif
28
29 #include <linux/byteorder/big_endian.h>
30
31 #endif /* __ASM_AVR32_BYTEORDER_H */