]>
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 | */ | |
5322ef20 | 12 | static inline uint32_t default_swab32(uint32_t val) |
51ea5519 NP |
13 | { |
14 | return (((val & 0xff000000) >> 24) | | |
15 | ((val & 0x00ff0000) >> 8) | | |
16 | ((val & 0x0000ff00) << 8) | | |
17 | ((val & 0x000000ff) << 24)); | |
18 | } | |
19 | ||
21e403a7 HW |
20 | #undef bswap32 |
21 | ||
51ea5519 NP |
22 | #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) |
23 | ||
24 | #define bswap32(x) ({ \ | |
5322ef20 | 25 | uint32_t __res; \ |
51ea5519 NP |
26 | if (__builtin_constant_p(x)) { \ |
27 | __res = default_swab32(x); \ | |
28 | } else { \ | |
b073b7a9 | 29 | __asm__("bswap %0" : "=r" (__res) : "0" ((uint32_t)(x))); \ |
51ea5519 NP |
30 | } \ |
31 | __res; }) | |
32 | ||
0fcabdeb SS |
33 | #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) |
34 | ||
35 | #include <stdlib.h> | |
36 | ||
37 | #define bswap32(x) _byteswap_ulong(x) | |
38 | ||
39 | #endif | |
40 | ||
41 | #ifdef bswap32 | |
42 | ||
51ea5519 NP |
43 | #undef ntohl |
44 | #undef htonl | |
45 | #define ntohl(x) bswap32(x) | |
46 | #define htonl(x) bswap32(x) | |
47 | ||
48 | #endif |