/Users/eugenesiegel/btc/bitcoin/src/compat/byteswap.h
Line | Count | Source |
1 | | // Copyright (c) 2014-2022 The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #ifndef BITCOIN_COMPAT_BYTESWAP_H |
6 | | #define BITCOIN_COMPAT_BYTESWAP_H |
7 | | |
8 | | #include <cstdint> |
9 | | #ifdef _MSC_VER |
10 | | #include <cstdlib> |
11 | | #endif |
12 | | |
13 | | |
14 | | // All internal_bswap_* functions can be replaced with std::byteswap once we |
15 | | // require c++23. Both libstdc++ and libc++ implement std::byteswap via these |
16 | | // builtins. |
17 | | |
18 | | #ifndef DISABLE_BUILTIN_BSWAPS |
19 | | # if defined __has_builtin |
20 | | # if __has_builtin(__builtin_bswap16) |
21 | 34.8k | # define bitcoin_builtin_bswap16(x) __builtin_bswap16(x) |
22 | | # endif |
23 | | # if __has_builtin(__builtin_bswap32) |
24 | 3.13G | # define bitcoin_builtin_bswap32(x) __builtin_bswap32(x) |
25 | | # endif |
26 | | # if __has_builtin(__builtin_bswap64) |
27 | 3.42G | # define bitcoin_builtin_bswap64(x) __builtin_bswap64(x) |
28 | | # endif |
29 | | # elif defined(_MSC_VER) |
30 | | # define bitcoin_builtin_bswap16(x) _byteswap_ushort(x) |
31 | | # define bitcoin_builtin_bswap32(x) _byteswap_ulong(x) |
32 | | # define bitcoin_builtin_bswap64(x) _byteswap_uint64(x) |
33 | | # endif |
34 | | #endif |
35 | | |
36 | | // MSVC's _byteswap_* functions are not constexpr |
37 | | |
38 | | #ifndef _MSC_VER |
39 | | #define BSWAP_CONSTEXPR constexpr |
40 | | #else |
41 | | #define BSWAP_CONSTEXPR |
42 | | #endif |
43 | | |
44 | | inline BSWAP_CONSTEXPR uint16_t internal_bswap_16(uint16_t x) |
45 | 34.8k | { |
46 | 34.8k | #ifdef bitcoin_builtin_bswap16 |
47 | 34.8k | return bitcoin_builtin_bswap16(x); Line | Count | Source | 21 | 34.8k | # define bitcoin_builtin_bswap16(x) __builtin_bswap16(x) |
|
48 | | #else |
49 | | return (x >> 8) | (x << 8); |
50 | | #endif |
51 | 34.8k | } |
52 | | |
53 | | inline BSWAP_CONSTEXPR uint32_t internal_bswap_32(uint32_t x) |
54 | 3.13G | { |
55 | 3.13G | #ifdef bitcoin_builtin_bswap32 |
56 | 3.13G | return bitcoin_builtin_bswap32(x); Line | Count | Source | 24 | 3.13G | # define bitcoin_builtin_bswap32(x) __builtin_bswap32(x) |
|
57 | | #else |
58 | | return (((x & 0xff000000U) >> 24) | ((x & 0x00ff0000U) >> 8) | |
59 | | ((x & 0x0000ff00U) << 8) | ((x & 0x000000ffU) << 24)); |
60 | | #endif |
61 | 3.13G | } |
62 | | |
63 | | inline BSWAP_CONSTEXPR uint64_t internal_bswap_64(uint64_t x) |
64 | 3.42G | { |
65 | 3.42G | #ifdef bitcoin_builtin_bswap64 |
66 | 3.42G | return bitcoin_builtin_bswap64(x); Line | Count | Source | 27 | 3.42G | # define bitcoin_builtin_bswap64(x) __builtin_bswap64(x) |
|
67 | | #else |
68 | | return (((x & 0xff00000000000000ull) >> 56) |
69 | | | ((x & 0x00ff000000000000ull) >> 40) |
70 | | | ((x & 0x0000ff0000000000ull) >> 24) |
71 | | | ((x & 0x000000ff00000000ull) >> 8) |
72 | | | ((x & 0x00000000ff000000ull) << 8) |
73 | | | ((x & 0x0000000000ff0000ull) << 24) |
74 | | | ((x & 0x000000000000ff00ull) << 40) |
75 | | | ((x & 0x00000000000000ffull) << 56)); |
76 | | #endif |
77 | 3.42G | } |
78 | | |
79 | | #endif // BITCOIN_COMPAT_BYTESWAP_H |