1 //===-- Unittests for the FXBits class ------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "include/llvm-libc-macros/stdfix-macros.h"
11 #include "src/__support/fixed_point/fx_bits.h"
12 #include "src/__support/integer_literals.h"
13 #include "test/UnitTest/Test.h"
15 using LIBC_NAMESPACE::fixed_point::FXBits
;
16 using LIBC_NAMESPACE::fixed_point::FXRep
;
18 using LIBC_NAMESPACE::operator""_u8
;
19 using LIBC_NAMESPACE::operator""_u16
;
20 using LIBC_NAMESPACE::operator""_u32
;
21 using LIBC_NAMESPACE::operator""_u64
;
23 class LlvmLibcFxBitsTest
: public LIBC_NAMESPACE::testing::Test
{
25 template <typename T
> void testBitwiseOps() {
26 EXPECT_EQ(LIBC_NAMESPACE::fixed_point::bit_and(T(0.75), T(0.375)), T(0.25));
27 EXPECT_EQ(LIBC_NAMESPACE::fixed_point::bit_or(T(0.75), T(0.375)), T(0.875));
28 using StorageType
= typename FXRep
<T
>::StorageType
;
29 StorageType a
= LIBC_NAMESPACE::cpp::bit_cast
<StorageType
>(T(0.75));
31 EXPECT_EQ(LIBC_NAMESPACE::fixed_point::bit_not(T(0.75)),
32 FXBits
<T
>(a
).get_val());
36 // -------------------------------- SHORT TESTS --------------------------------
38 TEST_F(LlvmLibcFxBitsTest
, FXBits_UnsignedShortFract
) {
39 auto bits_var
= FXBits
<unsigned short fract
>(0b00000000_u
8);
41 EXPECT_EQ(bits_var
.get_sign(), false);
42 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
43 EXPECT_EQ(bits_var
.get_fraction(), 0x00_u
8);
45 // Since an unsigned fract has no sign or integral components, setting either
46 // should have no effect.
48 bits_var
.set_sign(true);
50 EXPECT_EQ(bits_var
.get_sign(), false);
51 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
52 EXPECT_EQ(bits_var
.get_fraction(), 0x00_u
8);
54 bits_var
.set_integral(0xab);
56 EXPECT_EQ(bits_var
.get_sign(), false);
57 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
58 EXPECT_EQ(bits_var
.get_fraction(), 0x00_u
8);
60 // but setting the fraction should work
62 bits_var
.set_fraction(0xcd);
64 EXPECT_EQ(bits_var
.get_sign(), false);
65 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
66 EXPECT_EQ(bits_var
.get_fraction(), 0xcd_u
8);
69 testBitwiseOps
<unsigned short fract
>();
72 TEST_F(LlvmLibcFxBitsTest
, FXBits_UnsignedShortAccum
) {
73 auto bits_var
= FXBits
<unsigned short accum
>(0b00000000'00000000_u16
);
75 EXPECT_EQ(bits_var
.get_sign(), false);
76 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
77 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
79 bits_var
.set_sign(true); // 0 sign bits used
81 EXPECT_EQ(bits_var
.get_sign(), false);
82 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
83 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
85 bits_var
.set_integral(0xabcd); // 8 integral bits used
87 EXPECT_EQ(bits_var
.get_sign(), false);
88 EXPECT_EQ(bits_var
.get_integral(), 0x00cd_u
16);
89 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
91 bits_var
.set_fraction(0x21fe); // 8 fractional bits used
93 EXPECT_EQ(bits_var
.get_sign(), false);
94 EXPECT_EQ(bits_var
.get_integral(), 0x00cd_u
16);
95 EXPECT_EQ(bits_var
.get_fraction(), 0x00fe_u
16);
98 testBitwiseOps
<unsigned short accum
>();
101 TEST_F(LlvmLibcFxBitsTest
, FXBits_ShortFract
) {
102 auto bits_var
= FXBits
<short fract
>(0b0'0000000_u8
);
104 EXPECT_EQ(bits_var
.get_sign(), false);
105 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
106 EXPECT_EQ(bits_var
.get_fraction(), 0x00_u
8);
108 bits_var
.set_sign(true); // 1 sign bit used
110 EXPECT_EQ(bits_var
.get_sign(), true);
111 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
112 EXPECT_EQ(bits_var
.get_fraction(), 0x00_u
8);
114 bits_var
.set_integral(0xab); // 0 integral bits used
116 EXPECT_EQ(bits_var
.get_sign(), true);
117 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
118 EXPECT_EQ(bits_var
.get_fraction(), 0x00_u
8);
120 bits_var
.set_fraction(0xcd); // 7 fractional bits used
122 EXPECT_EQ(bits_var
.get_sign(), true);
123 EXPECT_EQ(bits_var
.get_integral(), 0x00_u
8);
124 EXPECT_EQ(bits_var
.get_fraction(), 0x4d_u
8);
127 testBitwiseOps
<short fract
>();
130 TEST_F(LlvmLibcFxBitsTest
, FXBits_ShortAccum
) {
131 auto bits_var
= FXBits
<short accum
>(0b0'00000000'0000000_u16
);
133 EXPECT_EQ(bits_var
.get_sign(), false);
134 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
135 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
137 bits_var
.set_sign(true); // 1 sign bit used
139 EXPECT_EQ(bits_var
.get_sign(), true);
140 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
141 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
143 bits_var
.set_integral(0xabcd); // 8 integral bits used
145 EXPECT_EQ(bits_var
.get_sign(), true);
146 EXPECT_EQ(bits_var
.get_integral(), 0x00cd_u
16);
147 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
149 bits_var
.set_fraction(0x21fe); // 7 fractional bits used
151 EXPECT_EQ(bits_var
.get_sign(), true);
152 EXPECT_EQ(bits_var
.get_integral(), 0x00cd_u
16);
153 EXPECT_EQ(bits_var
.get_fraction(), 0x007e_u
16);
156 testBitwiseOps
<short accum
>();
159 // -------------------------------- NORMAL TESTS -------------------------------
161 TEST_F(LlvmLibcFxBitsTest
, FXBits_UnsignedFract
) {
162 auto bits_var
= FXBits
<unsigned fract
>(0b0000000000000000_u
16);
164 EXPECT_EQ(bits_var
.get_sign(), false);
165 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
166 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
168 bits_var
.set_sign(true); // 0 sign bits used
170 EXPECT_EQ(bits_var
.get_sign(), false);
171 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
172 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
174 bits_var
.set_integral(0xabcd); // 0 integral bits used
176 EXPECT_EQ(bits_var
.get_sign(), false);
177 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
178 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
180 bits_var
.set_fraction(0xef12); // 16 fractional bits used
182 EXPECT_EQ(bits_var
.get_sign(), false);
183 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
184 EXPECT_EQ(bits_var
.get_fraction(), 0xef12_u
16);
187 testBitwiseOps
<unsigned fract
>();
190 TEST_F(LlvmLibcFxBitsTest
, FXBits_UnsignedAccum
) {
192 FXBits
<unsigned accum
>(0b0000000000000000'0000000000000000_u32
);
194 EXPECT_EQ(bits_var
.get_sign(), false);
195 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
196 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
198 bits_var
.set_sign(true); // 0 sign bits used
200 EXPECT_EQ(bits_var
.get_sign(), false);
201 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
202 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
204 bits_var
.set_integral(0xabcd); // 16 integral bits used
206 EXPECT_EQ(bits_var
.get_sign(), false);
207 EXPECT_EQ(bits_var
.get_integral(), 0x0000abcd_u
32);
208 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
210 bits_var
.set_fraction(0xef12); // 16 fractional bits used
212 EXPECT_EQ(bits_var
.get_sign(), false);
213 EXPECT_EQ(bits_var
.get_integral(), 0x0000abcd_u
32);
214 EXPECT_EQ(bits_var
.get_fraction(), 0x0000ef12_u
32);
217 testBitwiseOps
<unsigned accum
>();
220 TEST_F(LlvmLibcFxBitsTest
, FXBits_Fract
) {
221 auto bits_var
= FXBits
<fract
>(0b0'000000000000000_u16
);
223 EXPECT_EQ(bits_var
.get_sign(), false);
224 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
225 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
227 bits_var
.set_sign(true); // 1 sign bit used
229 EXPECT_EQ(bits_var
.get_sign(), true);
230 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
231 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
233 bits_var
.set_integral(0xabcd); // 0 integral bits used
235 EXPECT_EQ(bits_var
.get_sign(), true);
236 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
237 EXPECT_EQ(bits_var
.get_fraction(), 0x0000_u
16);
239 bits_var
.set_fraction(0xef12); // 15 fractional bits used
241 EXPECT_EQ(bits_var
.get_sign(), true);
242 EXPECT_EQ(bits_var
.get_integral(), 0x0000_u
16);
243 EXPECT_EQ(bits_var
.get_fraction(), 0x6f12_u
16);
246 testBitwiseOps
<fract
>();
249 TEST_F(LlvmLibcFxBitsTest
, FXBits_Accum
) {
250 auto bits_var
= FXBits
<accum
>(0b0'0000000000000000'000000000000000_u32
);
252 EXPECT_EQ(bits_var
.get_sign(), false);
253 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
254 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
256 bits_var
.set_sign(true); // 1 sign bit used
258 EXPECT_EQ(bits_var
.get_sign(), true);
259 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
260 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
262 bits_var
.set_integral(0xabcd); // 16 integral bits used
264 EXPECT_EQ(bits_var
.get_sign(), true);
265 EXPECT_EQ(bits_var
.get_integral(), 0x0000abcd_u
32);
266 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
268 bits_var
.set_fraction(0xef12); // 15 fractional bits used
270 EXPECT_EQ(bits_var
.get_sign(), true);
271 EXPECT_EQ(bits_var
.get_integral(), 0x0000abcd_u
32);
272 EXPECT_EQ(bits_var
.get_fraction(), 0x00006f12_u
32);
275 testBitwiseOps
<accum
>();
278 // --------------------------------- LONG TESTS --------------------------------
280 TEST_F(LlvmLibcFxBitsTest
, FXBits_UnsignedLongFract
) {
282 FXBits
<unsigned long fract
>(0b00000000000000000000000000000000_u
32);
284 EXPECT_EQ(bits_var
.get_sign(), false);
285 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
286 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
288 bits_var
.set_sign(true); // 0 sign bits used
290 EXPECT_EQ(bits_var
.get_sign(), false);
291 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
292 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
294 bits_var
.set_integral(0xabcdef12); // 0 integral bits used
296 EXPECT_EQ(bits_var
.get_sign(), false);
297 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
298 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
300 bits_var
.set_fraction(0xfedcba98); // 32 integral bits used
302 EXPECT_EQ(bits_var
.get_sign(), false);
303 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
304 EXPECT_EQ(bits_var
.get_fraction(), 0xfedcba98_u
32);
307 testBitwiseOps
<unsigned long fract
>();
310 TEST_F(LlvmLibcFxBitsTest
, FXBits_UnsignedLongAccum
) {
311 auto bits_var
= FXBits
<unsigned long accum
>(
312 0b00000000000000000000000000000000'00000000000000000000000000000000_u64
);
314 EXPECT_EQ(bits_var
.get_sign(), false);
315 EXPECT_EQ(bits_var
.get_integral(), 0x0000000000000000_u
64);
316 EXPECT_EQ(bits_var
.get_fraction(), 0x0000000000000000_u
64);
318 bits_var
.set_sign(true); // 0 sign bits used
320 EXPECT_EQ(bits_var
.get_sign(), false);
321 EXPECT_EQ(bits_var
.get_integral(), 0x0000000000000000_u
64);
322 EXPECT_EQ(bits_var
.get_fraction(), 0x0000000000000000_u
64);
324 bits_var
.set_integral(0xabcdef12); // 32 integral bits used
326 EXPECT_EQ(bits_var
.get_sign(), false);
327 EXPECT_EQ(bits_var
.get_integral(), 0x00000000abcdef12_u
64);
328 EXPECT_EQ(bits_var
.get_fraction(), 0x0000000000000000_u
64);
330 bits_var
.set_fraction(0xfedcba98); // 32 fractional bits used
332 EXPECT_EQ(bits_var
.get_sign(), false);
333 EXPECT_EQ(bits_var
.get_integral(), 0x00000000abcdef12_u
64);
334 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000fedcba98_u
64);
337 testBitwiseOps
<unsigned long accum
>();
340 TEST_F(LlvmLibcFxBitsTest
, FXBits_LongFract
) {
341 auto bits_var
= FXBits
<long fract
>(0b0'0000000000000000000000000000000_u32
);
343 EXPECT_EQ(bits_var
.get_sign(), false);
344 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
345 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
347 bits_var
.set_sign(true); // 1 sign bit used
349 EXPECT_EQ(bits_var
.get_sign(), true);
350 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
351 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
353 bits_var
.set_integral(0xabcdef12); // 0 integral bits used
355 EXPECT_EQ(bits_var
.get_sign(), true);
356 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
357 EXPECT_EQ(bits_var
.get_fraction(), 0x00000000_u
32);
359 bits_var
.set_fraction(0xfedcba98); // 31 fractional bits used
361 EXPECT_EQ(bits_var
.get_sign(), true);
362 EXPECT_EQ(bits_var
.get_integral(), 0x00000000_u
32);
363 EXPECT_EQ(bits_var
.get_fraction(), 0x7edcba98_u
32);
366 testBitwiseOps
<long fract
>();
369 TEST_F(LlvmLibcFxBitsTest
, FXBits_LongAccum
) {
370 auto bits_var
= FXBits
<long accum
>(
371 0b0'00000000000000000000000000000000'0000000000000000000000000000000_u64
);
373 EXPECT_EQ(bits_var
.get_sign(), false);
374 EXPECT_EQ(bits_var
.get_integral(), 0x0000000000000000_u
64);
375 EXPECT_EQ(bits_var
.get_fraction(), 0x0000000000000000_u
64);
377 bits_var
.set_sign(true); // 1 sign bit used
379 EXPECT_EQ(bits_var
.get_sign(), true);
380 EXPECT_EQ(bits_var
.get_integral(), 0x0000000000000000_u
64);
381 EXPECT_EQ(bits_var
.get_fraction(), 0x0000000000000000_u
64);
383 bits_var
.set_integral(0xabcdef12); // 32 integral bits used
385 EXPECT_EQ(bits_var
.get_sign(), true);
386 EXPECT_EQ(bits_var
.get_integral(), 0x00000000abcdef12_u
64);
387 EXPECT_EQ(bits_var
.get_fraction(), 0x0000000000000000_u
64);
389 bits_var
.set_fraction(0xfedcba98); // 31 fractional bits used
391 EXPECT_EQ(bits_var
.get_sign(), true);
392 EXPECT_EQ(bits_var
.get_integral(), 0x00000000abcdef12_u
64);
393 EXPECT_EQ(bits_var
.get_fraction(), 0x000000007edcba98_u
64);
396 testBitwiseOps
<long accum
>();