]>
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 | ||
c6c8d0b7 JN |
24 | #define bswap32 git_bswap32 |
25 | static inline uint32_t git_bswap32(uint32_t x) | |
26 | { | |
27 | uint32_t result; | |
28 | if (__builtin_constant_p(x)) | |
29 | result = default_swab32(x); | |
30 | else | |
31 | __asm__("bswap %0" : "=r" (result) : "0" (x)); | |
32 | return result; | |
33 | } | |
51ea5519 | 34 | |
0fcabdeb SS |
35 | #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) |
36 | ||
37 | #include <stdlib.h> | |
38 | ||
39 | #define bswap32(x) _byteswap_ulong(x) | |
40 | ||
41 | #endif | |
42 | ||
43 | #ifdef bswap32 | |
44 | ||
51ea5519 NP |
45 | #undef ntohl |
46 | #undef htonl | |
47 | #define ntohl(x) bswap32(x) | |
48 | #define htonl(x) bswap32(x) | |
49 | ||
50 | #endif |