summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/include/swap.h
blob: d5129add260bcfe701c27cc0e59b2b6797557479 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*-
 * Copyright (c) 2014-2019 MongoDB, Inc.
 * Copyright (c) 2008-2014 WiredTiger, Inc.
 *	All rights reserved.
 *
 * See the file LICENSE for redistribution information.
 */

#if defined(_MSC_VER) && (_MSC_VER >= 1300)
#include <stdlib.h>
#define __wt_bswap16(v) _byteswap_ushort(v)
#define __wt_bswap32(v) _byteswap_ulong(v)
#define __wt_bswap64(v) _byteswap_uint64(v)
#elif defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__) && \
  (__clang_major__ >= 3) && (__clang_minor__ >= 1)
#if __has_builtin(__builtin_bswap16)
#define __wt_bswap16(v) __builtin_bswap16(v)
#endif
#if __has_builtin(__builtin_bswap32)
#define __wt_bswap32(v) __builtin_bswap32(v)
#endif
#if __has_builtin(__builtin_bswap64)
#define __wt_bswap64(v) __builtin_bswap64(v)
#endif
#elif defined(__GNUC__) && (__GNUC__ >= 4)
#if __GNUC__ >= 4 && defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 3
#define __wt_bswap32(v) __builtin_bswap32(v)
#define __wt_bswap64(v) __builtin_bswap64(v)
#endif
#if __GNUC__ >= 4 && defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 8
#define __wt_bswap16(v) __builtin_bswap16(v)
#endif
#elif defined(__sun)
#include <sys/byteorder.h>
#define __wt_bswap16(v) BSWAP_16(v)
#define __wt_bswap32(v) BSWAP_32(v)
#define __wt_bswap64(v) BSWAP_64(v)
#endif

#if !defined(__wt_bswap64)
/*
 * __wt_bswap64 --
 *     64-bit unsigned little-endian to/from big-endian value.
 */
static inline uint64_t
__wt_bswap64(uint64_t v)
{
    return (
      /* NOLINTNEXTLINE(misc-redundant-expression) */
      ((v << 56) & 0xff00000000000000UL) | ((v << 40) & 0x00ff000000000000UL) |
      ((v << 24) & 0x0000ff0000000000UL) | ((v << 8) & 0x000000ff00000000UL) |
      ((v >> 8) & 0x00000000ff000000UL) | ((v >> 24) & 0x0000000000ff0000UL) |
      ((v >> 40) & 0x000000000000ff00UL) | ((v >> 56) & 0x00000000000000ffUL));
}
#endif

#if !defined(__wt_bswap32)
/*
 * __wt_bswap32 --
 *     32-bit unsigned little-endian to/from big-endian value.
 */
static inline uint32_t
__wt_bswap32(uint32_t v)
{
    return (((v << 24) & 0xff000000) | ((v << 8) & 0x00ff0000) | ((v >> 8) & 0x0000ff00) |
      ((v >> 24) & 0x000000ff));
}
#endif

#if !defined(__wt_bswap16)
/*
 * __wt_bswap16 --
 *     16-bit unsigned little-endian to/from big-endian value.
 */
static inline uint16_t
__wt_bswap16(uint16_t v)
{
    return (((v << 8) & 0xff00) | ((v >> 8) & 0x00ff));
}
#endif