]>
Commit | Line | Data |
---|---|---|
51ea5519 NP |
1 | /* |
2 | * Let's make sure we always have a sane definition for ntohl()/htonl(). | |
3 | * Some libraries define those as a function call, just to perform byte | |
4 | * shifting, bringing significant overhead to what should be a simple | |
5 | * operation. | |
6 | */ | |
7 | ||
8 | /* | |
9 | * Default version that the compiler ought to optimize properly with | |
10 | * constant values. | |
11 | */ | |
12 | static inline unsigned int default_swab32(unsigned int val) | |
13 | { | |
14 | return (((val & 0xff000000) >> 24) | | |
15 | ((val & 0x00ff0000) >> 8) | | |
16 | ((val & 0x0000ff00) << 8) | | |
17 | ((val & 0x000000ff) << 24)); | |
18 | } | |
19 | ||
20 | #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) | |
21 | ||
22 | #define bswap32(x) ({ \ | |
23 | unsigned int __res; \ | |
24 | if (__builtin_constant_p(x)) { \ | |
25 | __res = default_swab32(x); \ | |
26 | } else { \ | |
27 | __asm__("bswap %0" : "=r" (__res) : "0" (x)); \ | |
28 | } \ | |
29 | __res; }) | |
30 | ||
31 | #undef ntohl | |
32 | #undef htonl | |
33 | #define ntohl(x) bswap32(x) | |
34 | #define htonl(x) bswap32(x) | |
35 | ||
36 | #endif |