11
11
#include " test/UnitTest/Test.h"
12
12
13
13
using LIBC_NAMESPACE::fputil::FPBits;
14
+ using LIBC_NAMESPACE::fputil::FPType;
14
15
using LIBC_NAMESPACE::fputil::Sign;
16
+ using LIBC_NAMESPACE::fputil::internal::FPRep;
15
17
16
18
TEST (LlvmLibcFPBitsTest, FPType_IEEE754_Binary16) {
17
- using LIBC_NAMESPACE::fputil::FPType;
18
- using LIBC_NAMESPACE::fputil::internal::FPRep;
19
19
using Rep = FPRep<FPType::IEEE754_Binary16>;
20
20
using u16 = typename Rep::StorageType;
21
21
@@ -31,8 +31,6 @@ TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary16) {
31
31
}
32
32
33
33
TEST (LlvmLibcFPBitsTest, FPType_IEEE754_Binary32) {
34
- using LIBC_NAMESPACE::fputil::FPType;
35
- using LIBC_NAMESPACE::fputil::internal::FPRep;
36
34
using Rep = FPRep<FPType::IEEE754_Binary32>;
37
35
using u32 = typename Rep::StorageType;
38
36
@@ -51,8 +49,6 @@ TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary32) {
51
49
}
52
50
53
51
TEST (LlvmLibcFPBitsTest, FPType_IEEE754_Binary64) {
54
- using LIBC_NAMESPACE::fputil::FPType;
55
- using LIBC_NAMESPACE::fputil::internal::FPRep;
56
52
using Rep = FPRep<FPType::IEEE754_Binary64>;
57
53
using u64 = typename Rep::StorageType;
58
54
@@ -94,8 +90,6 @@ static constexpr UInt128 u128(uint64_t hi, uint64_t lo) {
94
90
}
95
91
96
92
TEST (LlvmLibcFPBitsTest, FPType_IEEE754_Binary128) {
97
- using LIBC_NAMESPACE::fputil::FPType;
98
- using LIBC_NAMESPACE::fputil::internal::FPRep;
99
93
using Rep = FPRep<FPType::IEEE754_Binary128>;
100
94
101
95
EXPECT_EQ (
@@ -137,8 +131,6 @@ TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary128) {
137
131
}
138
132
139
133
TEST (LlvmLibcFPBitsTest, FPType_X86_Binary80) {
140
- using LIBC_NAMESPACE::fputil::FPType;
141
- using LIBC_NAMESPACE::fputil::internal::FPRep;
142
134
using Rep = FPRep<FPType::X86_Binary80>;
143
135
144
136
EXPECT_EQ (
@@ -180,8 +172,6 @@ TEST(LlvmLibcFPBitsTest, FPType_X86_Binary80) {
180
172
}
181
173
182
174
TEST (LlvmLibcFPBitsTest, FPType_X86_Binary80_IsNan) {
183
- using LIBC_NAMESPACE::fputil::FPType;
184
- using LIBC_NAMESPACE::fputil::internal::FPRep;
185
175
using Rep = FPRep<FPType::X86_Binary80>;
186
176
187
177
const auto is_nan = [](uint64_t hi, uint64_t lo) {
@@ -229,6 +219,92 @@ TEST(LlvmLibcFPBitsTest, FPType_X86_Binary80_IsNan) {
229
219
0b1000000000000000000000000000000000000000000000000000000000000000 ));
230
220
}
231
221
222
+ enum class FP {
223
+ ZERO,
224
+ MIN_SUBNORMAL,
225
+ MAX_SUBNORMAL,
226
+ MIN_NORMAL,
227
+ ONE,
228
+ MAX_NORMAL,
229
+ INF,
230
+ BUILD_NAN,
231
+ BUILD_QUIET_NAN
232
+ };
233
+
234
+ using FPTypes = LIBC_NAMESPACE::testing::TypeList<
235
+ FPRep<FPType::IEEE754_Binary16>, FPRep<FPType::IEEE754_Binary32>,
236
+ FPRep<FPType::IEEE754_Binary64>, FPRep<FPType::IEEE754_Binary128>,
237
+ FPRep<FPType::X86_Binary80>>;
238
+
239
+ // Tests all properties for all types of float.
240
+ TYPED_TEST (LlvmLibcFPBitsTest, Properties, FPTypes) {
241
+ static constexpr auto make_storage = [](Sign sign, FP fp) {
242
+ switch (fp) {
243
+ case FP::ZERO:
244
+ return T::zero (sign);
245
+ case FP::MIN_SUBNORMAL:
246
+ return T::min_subnormal (sign);
247
+ case FP::MAX_SUBNORMAL:
248
+ return T::max_subnormal (sign);
249
+ case FP::MIN_NORMAL:
250
+ return T::min_normal (sign);
251
+ case FP::ONE:
252
+ return T::one (sign);
253
+ case FP::MAX_NORMAL:
254
+ return T::max_normal (sign);
255
+ case FP::INF:
256
+ return T::inf (sign);
257
+ case FP::BUILD_NAN:
258
+ return T::build_nan (sign);
259
+ case FP::BUILD_QUIET_NAN:
260
+ return T::build_quiet_nan (sign);
261
+ }
262
+ };
263
+ static constexpr auto make = [](Sign sign, FP fp) -> T {
264
+ return T (make_storage (sign, fp));
265
+ };
266
+ constexpr FP fp_values[] = {
267
+ FP::ZERO, FP::MIN_SUBNORMAL, FP::MAX_SUBNORMAL,
268
+ FP::MIN_NORMAL, FP::ONE, FP::MAX_NORMAL,
269
+ FP::INF, FP::BUILD_NAN, FP::BUILD_QUIET_NAN};
270
+ constexpr Sign signs[] = {Sign::POS, Sign::NEG};
271
+ for (Sign sign : signs) {
272
+ for (FP fp : fp_values) {
273
+ const T value = make (sign, fp);
274
+ // is_zero
275
+ ASSERT_EQ (value.is_zero (), fp == FP::ZERO);
276
+ // is_inf_or_nan
277
+ ASSERT_EQ (value.is_inf_or_nan (), fp == FP::INF || fp == FP::BUILD_NAN ||
278
+ fp == FP::BUILD_QUIET_NAN);
279
+ // is_finite
280
+ ASSERT_EQ (value.is_finite (), fp != FP::INF && fp != FP::BUILD_NAN &&
281
+ fp != FP::BUILD_QUIET_NAN);
282
+ // is_inf
283
+ ASSERT_EQ (value.is_inf (), fp == FP::INF);
284
+ // is_nan
285
+ ASSERT_EQ (value.is_nan (),
286
+ fp == FP::BUILD_NAN || fp == FP::BUILD_QUIET_NAN);
287
+ // is_normal
288
+ ASSERT_EQ (value.is_normal (),
289
+ fp == FP::MIN_NORMAL || fp == FP::ONE || fp == FP::MAX_NORMAL);
290
+ // is_quiet_nan
291
+ ASSERT_EQ (value.is_quiet_nan (), fp == FP::BUILD_QUIET_NAN);
292
+ // is_signaling_nan
293
+ ASSERT_EQ (value.is_signaling_nan (), fp == FP::BUILD_NAN);
294
+ // is_subnormal
295
+ ASSERT_EQ (value.is_subnormal (), fp == FP::ZERO ||
296
+ fp == FP::MIN_SUBNORMAL ||
297
+ fp == FP::MAX_SUBNORMAL);
298
+ // is_pos
299
+ ASSERT_EQ (value.is_pos (), sign == Sign::POS);
300
+ ASSERT_EQ (value.sign ().is_pos (), sign == Sign::POS);
301
+ // is_neg
302
+ ASSERT_EQ (value.is_neg (), sign == Sign::NEG);
303
+ ASSERT_EQ (value.sign ().is_neg (), sign == Sign::NEG);
304
+ }
305
+ }
306
+ }
307
+
232
308
TEST (LlvmLibcFPBitsTest, FloatType) {
233
309
using FloatBits = FPBits<float >;
234
310
0 commit comments