Jlm
Loading...
Searching...
No Matches
MathTests.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2023 HÃ¥vard Krogstie <krogstie.havard@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#include <gtest/gtest.h>
7
8#include <jlm/util/Math.hpp>
9
10using namespace jlm::util;
11
12TEST(MathTests, TestLog2Floor)
13{
14 auto testByteRange = [](auto type)
15 {
16 using T = decltype(type);
17 EXPECT_EQ(log2Floor<T>(-10), -1);
18 EXPECT_EQ(log2Floor<T>(-1), -1);
19 EXPECT_EQ(log2Floor<T>(0), -1);
20 EXPECT_EQ(log2Floor<T>(1), 0);
21 EXPECT_EQ(log2Floor<T>(2), 1);
22 EXPECT_EQ(log2Floor<T>(3), 1);
23 EXPECT_EQ(log2Floor<T>(4), 2);
24 EXPECT_EQ(log2Floor<T>(7), 2);
25 EXPECT_EQ(log2Floor<T>(8), 3);
26 EXPECT_EQ(log2Floor<T>(63), 5);
27 EXPECT_EQ(log2Floor<T>(64), 6);
28 EXPECT_EQ(log2Floor<T>(127), 6);
29 };
30
31 testByteRange(int8_t(0));
32 testByteRange(int16_t(0));
33 testByteRange(int32_t(0));
34 testByteRange(int64_t(0));
35
36 EXPECT_EQ(log2Floor<uint16_t>(0x7FFF), 14);
37 EXPECT_EQ(log2Floor<uint16_t>(0x8000), 15);
38 EXPECT_EQ(log2Floor<uint16_t>(0xFFFF), 15);
39
40 EXPECT_EQ(log2Floor<uint32_t>(0x7FFFFFFF), 30);
41 EXPECT_EQ(log2Floor<uint32_t>(0x80000000), 31);
42 EXPECT_EQ(log2Floor<uint32_t>(0xFFFFFFFF), 31);
43}
44
45TEST(MathTests, TestRoundUpToPowerOf2)
46{
47 EXPECT_EQ(RoundUpToPowerOf2<int32_t>(-10), 1);
48 EXPECT_EQ(RoundUpToPowerOf2<int32_t>(0), 1);
49 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(0), 1u);
50 EXPECT_EQ(RoundUpToPowerOf2<int32_t>(1), 1);
51 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(1), 1u);
52 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(2), 2u);
53 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(3), 4u);
54
55 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(255), 256u);
56 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(256), 256u);
57 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(257), 512u);
58 EXPECT_EQ(RoundUpToPowerOf2<uint64_t>(0xFFFFFFFF), 0x100000000ul);
59}
60
61TEST(MathTests, TestRoundUpToMultipleOf)
62{
63 for (int i = -20; i <= 20; i++)
64 {
65 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(i, 1), i);
66 }
67
68 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(0, 5), 0);
69 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(1, 5), 5);
70 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(4, 5), 5);
71 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(5, 5), 5);
72 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(6, 5), 10);
73 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(123, 5), 125);
74 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(8567, 2000), 10'000);
75 EXPECT_EQ(RoundUpToMultipleOf<uint32_t>(8567, 2000), 10'000u);
76
77 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-1, 7), 0);
78 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-6, 7), 0);
79 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-7, 7), -7);
80 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-8, 7), -7);
81 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-14, 7), -14);
82 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-15, 7), -14);
83 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-14'006, 7), -14'000);
84
85 // Test different int sizes
86 EXPECT_EQ(RoundUpToMultipleOf<uint8_t>(13, 7), 14u);
87 EXPECT_EQ(RoundUpToMultipleOf<uint16_t>(13, 7), 14u);
88 EXPECT_EQ(RoundUpToMultipleOf<uint32_t>(13, 7), 14u);
89 EXPECT_EQ(RoundUpToMultipleOf<uint64_t>(13, 7), 14u);
90
91 EXPECT_EQ(RoundUpToMultipleOf<int8_t>(-13, 7), -7);
92 EXPECT_EQ(RoundUpToMultipleOf<int16_t>(-13, 7), -7);
93 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-13, 7), -7);
94 EXPECT_EQ(RoundUpToMultipleOf<int64_t>(-13, 7), -7);
95}
96
97TEST(MathTests, TestBitsRequiredToRepresent)
98{
99 EXPECT_EQ(BitsRequiredToRepresent<int8_t>(-1), 8);
100 EXPECT_EQ(BitsRequiredToRepresent<int32_t>(-1), 32);
101
102 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(0), 0);
103 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(1), 1);
104 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(2), 2);
105 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(3), 2);
106 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(4), 3);
107 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(7), 3);
108 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(8), 4);
109
110 EXPECT_EQ(BitsRequiredToRepresent(0xFFFF), 16);
111 EXPECT_EQ(BitsRequiredToRepresent(0x10000), 17);
112 EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFF), 32);
113 EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFFu), 32);
114 EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFF'FFFF'FFFFll), 64);
115 EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFF'FFFF'FFFFull), 64);
116}
117
118TEST(MathTests, TestBitWidthOfEnum)
119{
120 enum class TestEnum1
121 {
122 Zero
123 };
124
125 enum class TestEnum4
126 {
127 Zero,
128 One,
129 Two,
130 Three
131 };
132
133 enum class TestEnum5
134 {
135 Zero,
136 One,
137 Two,
138 Three,
139 Four
140 };
141
142 enum class TestEnum127
143 {
144 Zero = 0,
145 OneHundredAndTwentySeven = 127
146 };
147
148 EXPECT_EQ(BitWidthOfEnum(TestEnum1::Zero), 0);
149 EXPECT_EQ(BitWidthOfEnum(TestEnum4::Three), 2);
150 EXPECT_EQ(BitWidthOfEnum(TestEnum5::Four), 3);
151 EXPECT_EQ(BitWidthOfEnum(TestEnum127::OneHundredAndTwentySeven), 7);
152}
153
155{
156 EXPECT_EQ(truncateAndSignExtend(0xFF, 8), -1);
157 EXPECT_EQ(truncateAndSignExtend(0x0F, 8), 15);
158 EXPECT_EQ(truncateAndSignExtend(1, 1), -1);
159 EXPECT_EQ(truncateAndSignExtend(0, 1), 0);
160 EXPECT_EQ(truncateAndSignExtend(1234, 64), 1234);
161 EXPECT_EQ(truncateAndSignExtend(-1, 32), -1);
162 EXPECT_EQ(truncateAndSignExtend(-1, 16), -1);
163 EXPECT_EQ(truncateAndSignExtend(-1, 8), -1);
164 EXPECT_EQ(truncateAndSignExtend(127, 8), 127);
165 EXPECT_EQ(truncateAndSignExtend(-128, 8), -128);
166}
167
169{
170 EXPECT_EQ(truncateAndZeroExtend(0xFF, 8), 255);
171 EXPECT_EQ(truncateAndZeroExtend(0x0F, 8), 15);
172 EXPECT_EQ(truncateAndZeroExtend(1, 1), 1);
173 EXPECT_EQ(truncateAndZeroExtend(0, 1), 0);
174 EXPECT_EQ(truncateAndZeroExtend(1234, 64), 1234);
175 EXPECT_EQ(truncateAndZeroExtend(-1, 32), 0xFFFF'FFFF);
176 EXPECT_EQ(truncateAndZeroExtend(-1, 16), 0xFFFF);
177 EXPECT_EQ(truncateAndZeroExtend(-1, 8), 0xFF);
178 EXPECT_EQ(truncateAndZeroExtend(127, 8), 127);
179 EXPECT_EQ(truncateAndZeroExtend(-128, 8), 128);
180}
TEST(MathTests, TestLog2Floor)
Definition MathTests.cpp:12
static constexpr int BitsRequiredToRepresent(T value)
Definition Math.hpp:97
int64_t truncateAndZeroExtend(int64_t value, uint64_t keepBits)
Definition Math.hpp:156
static constexpr int BitWidthOfEnum(T endValue)
Definition Math.hpp:110
int64_t truncateAndSignExtend(int64_t value, uint64_t keepBits)
Definition Math.hpp:134