reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    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
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
//===- unittests/Support/SwapByteOrderTest.cpp - swap byte order test -----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/Support/SwapByteOrder.h"
#include "gtest/gtest.h"
#include <cstdlib>
#include <ctime>
using namespace llvm;

#undef max

namespace {

// In these first two tests all of the original_uintx values are truncated
// except for 64. We could avoid this, but there's really no point.

TEST(getSwappedBytes, UnsignedRoundTrip) {
  // The point of the bit twiddling of magic is to test with and without bits
  // in every byte.
  uint64_t value = 1;
  for (std::size_t i = 0; i <= sizeof(value); ++i) {
    uint8_t original_uint8 = static_cast<uint8_t>(value);
    EXPECT_EQ(original_uint8,
              sys::getSwappedBytes(sys::getSwappedBytes(original_uint8)));

    uint16_t original_uint16 = static_cast<uint16_t>(value);
    EXPECT_EQ(original_uint16,
              sys::getSwappedBytes(sys::getSwappedBytes(original_uint16)));

    uint32_t original_uint32 = static_cast<uint32_t>(value);
    EXPECT_EQ(original_uint32,
              sys::getSwappedBytes(sys::getSwappedBytes(original_uint32)));

    uint64_t original_uint64 = static_cast<uint64_t>(value);
    EXPECT_EQ(original_uint64,
              sys::getSwappedBytes(sys::getSwappedBytes(original_uint64)));

    value = (value << 8) | 0x55; // binary 0101 0101.
  }
}

TEST(getSwappedBytes, SignedRoundTrip) {
  // The point of the bit twiddling of magic is to test with and without bits
  // in every byte.
  uint64_t value = 1;
  for (std::size_t i = 0; i <= sizeof(value); ++i) {
    int8_t original_int8 = static_cast<int8_t>(value);
    EXPECT_EQ(original_int8,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int8)));

    int16_t original_int16 = static_cast<int16_t>(value);
    EXPECT_EQ(original_int16,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int16)));

    int32_t original_int32 = static_cast<int32_t>(value);
    EXPECT_EQ(original_int32,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int32)));

    int64_t original_int64 = static_cast<int64_t>(value);
    EXPECT_EQ(original_int64,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int64)));

    // Test other sign.
    value *= -1;

    original_int8 = static_cast<int8_t>(value);
    EXPECT_EQ(original_int8,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int8)));

    original_int16 = static_cast<int16_t>(value);
    EXPECT_EQ(original_int16,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int16)));

    original_int32 = static_cast<int32_t>(value);
    EXPECT_EQ(original_int32,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int32)));

    original_int64 = static_cast<int64_t>(value);
    EXPECT_EQ(original_int64,
              sys::getSwappedBytes(sys::getSwappedBytes(original_int64)));

    // Return to normal sign and twiddle.
    value *= -1;
    value = (value << 8) | 0x55; // binary 0101 0101.
  }
}

TEST(getSwappedBytes, uint8_t) {
  EXPECT_EQ(uint8_t(0x11), sys::getSwappedBytes(uint8_t(0x11)));
}

TEST(getSwappedBytes, uint16_t) {
  EXPECT_EQ(uint16_t(0x1122), sys::getSwappedBytes(uint16_t(0x2211)));
}

TEST(getSwappedBytes, uint32_t) {
  EXPECT_EQ(uint32_t(0x11223344), sys::getSwappedBytes(uint32_t(0x44332211)));
}

TEST(getSwappedBytes, uint64_t) {
  EXPECT_EQ(uint64_t(0x1122334455667788ULL),
    sys::getSwappedBytes(uint64_t(0x8877665544332211ULL)));
}

TEST(getSwappedBytes, int8_t) {
  EXPECT_EQ(int8_t(0x11), sys::getSwappedBytes(int8_t(0x11)));
}

TEST(getSwappedBytes, int16_t) {
  EXPECT_EQ(int16_t(0x1122), sys::getSwappedBytes(int16_t(0x2211)));
}

TEST(getSwappedBytes, int32_t) {
  EXPECT_EQ(int32_t(0x11223344), sys::getSwappedBytes(int32_t(0x44332211)));
}

TEST(getSwappedBytes, int64_t) {
  EXPECT_EQ(int64_t(0x1122334455667788LL),
    sys::getSwappedBytes(int64_t(0x8877665544332211LL)));
}

TEST(getSwappedBytes, float) {
  EXPECT_EQ(1.79366203433576585078237386661e-43f, sys::getSwappedBytes(-0.0f));
  // 0x11223344
  EXPECT_EQ(7.1653228759765625e2f, sys::getSwappedBytes(1.2795344e-28f));
}

TEST(getSwappedBytes, double) {
  EXPECT_EQ(6.32404026676795576546008054871e-322, sys::getSwappedBytes(-0.0));
  // 0x1122334455667788
  EXPECT_EQ(-7.08687663657301358331704585496e-268,
    sys::getSwappedBytes(3.84141202447173065923064450234e-226));
}

TEST(swapByteOrder, uint8_t) {
  uint8_t value = 0x11;
  sys::swapByteOrder(value);
  EXPECT_EQ(uint8_t(0x11), value);
}

TEST(swapByteOrder, uint16_t) {
  uint16_t value = 0x2211;
  sys::swapByteOrder(value);
  EXPECT_EQ(uint16_t(0x1122), value);
}

TEST(swapByteOrder, uint32_t) {
  uint32_t value = 0x44332211;
  sys::swapByteOrder(value);
  EXPECT_EQ(uint32_t(0x11223344), value);
}

TEST(swapByteOrder, uint64_t) {
  uint64_t value = 0x8877665544332211ULL;
  sys::swapByteOrder(value);
  EXPECT_EQ(uint64_t(0x1122334455667788ULL), value);
}

TEST(swapByteOrder, int8_t) {
  int8_t value = 0x11;
  sys::swapByteOrder(value);
  EXPECT_EQ(int8_t(0x11), value);
}

TEST(swapByteOrder, int16_t) {
  int16_t value = 0x2211;
  sys::swapByteOrder(value);
  EXPECT_EQ(int16_t(0x1122), value);
}

TEST(swapByteOrder, int32_t) {
  int32_t value = 0x44332211;
  sys::swapByteOrder(value);
  EXPECT_EQ(int32_t(0x11223344), value);
}

TEST(swapByteOrder, int64_t) {
  int64_t value = 0x8877665544332211LL;
  sys::swapByteOrder(value);
  EXPECT_EQ(int64_t(0x1122334455667788LL), value);
}

TEST(swapByteOrder, float) {
  float value = 7.1653228759765625e2f; // 0x44332211
  sys::swapByteOrder(value);
  EXPECT_EQ(1.2795344e-28f, value);
}

TEST(swapByteOrder, double) {
  double value = -7.08687663657301358331704585496e-268; // 0x8877665544332211
  sys::swapByteOrder(value);
  EXPECT_EQ(3.84141202447173065923064450234e-226, value);
}

}