781 lines · cpp
1//===-- Unittests for the FPBits class ------------------------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/FPUtil/FPBits.h"10#include "src/__support/FPUtil/fpbits_str.h"11#include "src/__support/big_int.h"12#include "src/__support/integer_literals.h"13#include "src/__support/macros/properties/types.h"14#include "src/__support/sign.h" // Sign15#include "test/UnitTest/Test.h"16 17using LIBC_NAMESPACE::Sign;18using LIBC_NAMESPACE::UInt;19using LIBC_NAMESPACE::fputil::FPBits;20using LIBC_NAMESPACE::fputil::FPType;21using LIBC_NAMESPACE::fputil::internal::FPRep;22 23using LIBC_NAMESPACE::operator""_u16;24using LIBC_NAMESPACE::operator""_u32;25using LIBC_NAMESPACE::operator""_u64;26using LIBC_NAMESPACE::operator""_u96;27using LIBC_NAMESPACE::operator""_u128;28 29TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary16) {30 using Rep = FPRep<FPType::IEEE754_Binary16>;31 using u16 = typename Rep::StorageType;32 33 EXPECT_EQ(0b0'00000'0000000000_u16, u16(Rep::zero()));34 EXPECT_EQ(0b0'01111'0000000000_u16, u16(Rep::one()));35 EXPECT_EQ(0b0'00000'0000000001_u16, u16(Rep::min_subnormal()));36 EXPECT_EQ(0b0'00000'1111111111_u16, u16(Rep::max_subnormal()));37 EXPECT_EQ(0b0'00001'0000000000_u16, u16(Rep::min_normal()));38 EXPECT_EQ(0b0'11110'1111111111_u16, u16(Rep::max_normal()));39 EXPECT_EQ(0b0'11111'0000000000_u16, u16(Rep::inf()));40 EXPECT_EQ(0b0'11111'0100000000_u16, u16(Rep::signaling_nan()));41 EXPECT_EQ(0b0'11111'1000000000_u16, u16(Rep::quiet_nan()));42}43 44TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary32) {45 using Rep = FPRep<FPType::IEEE754_Binary32>;46 using u32 = typename Rep::StorageType;47 48 EXPECT_EQ(0b0'00000000'00000000000000000000000_u32, u32(Rep::zero()));49 EXPECT_EQ(0b0'01111111'00000000000000000000000_u32, u32(Rep::one()));50 EXPECT_EQ(0b0'00000000'00000000000000000000001_u32,51 u32(Rep::min_subnormal()));52 EXPECT_EQ(0b0'00000000'11111111111111111111111_u32,53 u32(Rep::max_subnormal()));54 EXPECT_EQ(0b0'00000001'00000000000000000000000_u32, u32(Rep::min_normal()));55 EXPECT_EQ(0b0'11111110'11111111111111111111111_u32, u32(Rep::max_normal()));56 EXPECT_EQ(0b0'11111111'00000000000000000000000_u32, u32(Rep::inf()));57 EXPECT_EQ(0b0'11111111'01000000000000000000000_u32,58 u32(Rep::signaling_nan()));59 EXPECT_EQ(0b0'11111111'10000000000000000000000_u32, u32(Rep::quiet_nan()));60}61 62TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary64) {63 using Rep = FPRep<FPType::IEEE754_Binary64>;64 using u64 = typename Rep::StorageType;65 66 EXPECT_EQ(67 0b0'00000000000'0000000000000000000000000000000000000000000000000000_u64,68 u64(Rep::zero()));69 EXPECT_EQ(70 0b0'01111111111'0000000000000000000000000000000000000000000000000000_u64,71 u64(Rep::one()));72 EXPECT_EQ(73 0b0'00000000000'0000000000000000000000000000000000000000000000000001_u64,74 u64(Rep::min_subnormal()));75 EXPECT_EQ(76 0b0'00000000000'1111111111111111111111111111111111111111111111111111_u64,77 u64(Rep::max_subnormal()));78 EXPECT_EQ(79 0b0'00000000001'0000000000000000000000000000000000000000000000000000_u64,80 u64(Rep::min_normal()));81 EXPECT_EQ(82 0b0'11111111110'1111111111111111111111111111111111111111111111111111_u64,83 u64(Rep::max_normal()));84 EXPECT_EQ(85 0b0'11111111111'0000000000000000000000000000000000000000000000000000_u64,86 u64(Rep::inf()));87 EXPECT_EQ(88 0b0'11111111111'0100000000000000000000000000000000000000000000000000_u64,89 u64(Rep::signaling_nan()));90 EXPECT_EQ(91 0b0'11111111111'1000000000000000000000000000000000000000000000000000_u64,92 u64(Rep::quiet_nan()));93}94 95TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary128) {96 using Rep = FPRep<FPType::IEEE754_Binary128>;97 98 EXPECT_EQ(99 0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128,100 UInt128(Rep::zero()));101 EXPECT_EQ(102 0b0'011111111111111'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128,103 UInt128(Rep::one()));104 EXPECT_EQ(105 0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001_u128,106 UInt128(Rep::min_subnormal()));107 EXPECT_EQ(108 0b0'000000000000000'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111_u128,109 UInt128(Rep::max_subnormal()));110 EXPECT_EQ(111 0b0'000000000000001'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128,112 UInt128(Rep::min_normal()));113 EXPECT_EQ(114 0b0'111111111111110'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111_u128,115 UInt128(Rep::max_normal()));116 EXPECT_EQ(117 0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128,118 UInt128(Rep::inf()));119 EXPECT_EQ(120 0b0'111111111111111'0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128,121 UInt128(Rep::signaling_nan()));122 EXPECT_EQ(123 0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128,124 UInt128(Rep::quiet_nan()));125}126 127#ifdef LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80128TEST(LlvmLibcFPBitsTest, FPType_X86_Binary80) {129 using Rep = FPRep<FPType::X86_Binary80>;130 131#if __SIZEOF_LONG_DOUBLE__ == 16132 EXPECT_EQ(133 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000000_u128,134 UInt128(Rep::zero()));135 EXPECT_EQ(136 0b0'0111111111111111000000000000000000000000000000000000000000000000000000000000000_u128,137 UInt128(Rep::one()));138 EXPECT_EQ(139 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000001_u128,140 UInt128(Rep::min_subnormal()));141 EXPECT_EQ(142 0b0'0000000000000000111111111111111111111111111111111111111111111111111111111111111_u128,143 UInt128(Rep::max_subnormal()));144 EXPECT_EQ(145 0b0'0000000000000011000000000000000000000000000000000000000000000000000000000000000_u128,146 UInt128(Rep::min_normal()));147 EXPECT_EQ(148 0b0'1111111111111101111111111111111111111111111111111111111111111111111111111111111_u128,149 UInt128(Rep::max_normal()));150 EXPECT_EQ(151 0b0'1111111111111111000000000000000000000000000000000000000000000000000000000000000_u128,152 UInt128(Rep::inf()));153 EXPECT_EQ(154 0b0'1111111111111111010000000000000000000000000000000000000000000000000000000000000_u128,155 UInt128(Rep::signaling_nan()));156 EXPECT_EQ(157 0b0'1111111111111111100000000000000000000000000000000000000000000000000000000000000_u128,158 UInt128(Rep::quiet_nan()));159#elif __SIZEOF_LONG_DOUBLE__ == 12160 EXPECT_EQ(161 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000000_u96,162 UInt<96>(Rep::zero()));163 EXPECT_EQ(164 0b0'0111111111111111000000000000000000000000000000000000000000000000000000000000000_u96,165 UInt<96>(Rep::one()));166 EXPECT_EQ(167 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000001_u96,168 UInt<96>(Rep::min_subnormal()));169 EXPECT_EQ(170 0b0'0000000000000000111111111111111111111111111111111111111111111111111111111111111_u96,171 UInt<96>(Rep::max_subnormal()));172 EXPECT_EQ(173 0b0'0000000000000011000000000000000000000000000000000000000000000000000000000000000_u96,174 UInt<96>(Rep::min_normal()));175 EXPECT_EQ(176 0b0'1111111111111101111111111111111111111111111111111111111111111111111111111111111_u96,177 UInt<96>(Rep::max_normal()));178 EXPECT_EQ(179 0b0'1111111111111111000000000000000000000000000000000000000000000000000000000000000_u96,180 UInt<96>(Rep::inf()));181 EXPECT_EQ(182 0b0'1111111111111111010000000000000000000000000000000000000000000000000000000000000_u96,183 UInt<96>(Rep::signaling_nan()));184 EXPECT_EQ(185 0b0'1111111111111111100000000000000000000000000000000000000000000000000000000000000_u96,186 UInt<96>(Rep::quiet_nan()));187#else188#error "unhandled long double type"189#endif190}191 192TEST(LlvmLibcFPBitsTest, FPType_X86_Binary80_IsNan) {193 using Rep = FPRep<FPType::X86_Binary80>;194 195#if __SIZEOF_LONG_DOUBLE__ == 16196 EXPECT_TRUE( // NAN : Pseudo-Infinity197 Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000000_u128)198 .is_nan());199 EXPECT_TRUE( // NAN : Pseudo Not a Number200 Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000001_u128)201 .is_nan());202 EXPECT_TRUE( // NAN : Pseudo Not a Number203 Rep(0b0'111111111111111'0100000000000000000000000000000000000000000000000000000000000000_u128)204 .is_nan());205 EXPECT_TRUE( // NAN : Signalling Not a Number206 Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000001_u128)207 .is_nan());208 EXPECT_TRUE( // NAN : Floating-point Indefinite209 Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000000_u128)210 .is_nan());211 EXPECT_TRUE( // NAN : Quiet Not a Number212 Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000001_u128)213 .is_nan());214 EXPECT_TRUE( // NAN : Unnormal215 Rep(0b0'111111111111110'0000000000000000000000000000000000000000000000000000000000000000_u128)216 .is_nan());217 EXPECT_FALSE( // Zero218 Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000_u128)219 .is_nan());220 EXPECT_FALSE( // Subnormal221 Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000001_u128)222 .is_nan());223 EXPECT_FALSE( // Pseudo Denormal224 Rep(0b0'000000000000000'1000000000000000000000000000000000000000000000000000000000000001_u128)225 .is_nan());226 EXPECT_FALSE( // Infinity227 Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000000_u128)228 .is_nan());229 EXPECT_FALSE( // Normalized230 Rep(0b0'111111111111110'1000000000000000000000000000000000000000000000000000000000000000_u128)231 .is_nan());232#elif __SIZEOF_LONG_DOUBLE__ == 12233 EXPECT_TRUE( // NAN : Pseudo-Infinity234 Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000000_u96)235 .is_nan());236 EXPECT_TRUE( // NAN : Pseudo Not a Number237 Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000001_u96)238 .is_nan());239 EXPECT_TRUE( // NAN : Pseudo Not a Number240 Rep(0b0'111111111111111'0100000000000000000000000000000000000000000000000000000000000000_u96)241 .is_nan());242 EXPECT_TRUE( // NAN : Signalling Not a Number243 Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000001_u96)244 .is_nan());245 EXPECT_TRUE( // NAN : Floating-point Indefinite246 Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000000_u96)247 .is_nan());248 EXPECT_TRUE( // NAN : Quiet Not a Number249 Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000001_u96)250 .is_nan());251 EXPECT_TRUE( // NAN : Unnormal252 Rep(0b0'111111111111110'0000000000000000000000000000000000000000000000000000000000000000_u96)253 .is_nan());254 EXPECT_FALSE( // Zero255 Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000_u96)256 .is_nan());257 EXPECT_FALSE( // Subnormal258 Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000001_u96)259 .is_nan());260 EXPECT_FALSE( // Pseudo Denormal261 Rep(0b0'000000000000000'1000000000000000000000000000000000000000000000000000000000000001_u96)262 .is_nan());263 EXPECT_FALSE( // Infinity264 Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000000_u96)265 .is_nan());266 EXPECT_FALSE( // Normalized267 Rep(0b0'111111111111110'1000000000000000000000000000000000000000000000000000000000000000_u96)268 .is_nan());269#else270#error "unhandled long double type"271#endif272}273#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80274 275enum class FP {276 ZERO,277 MIN_SUBNORMAL,278 MAX_SUBNORMAL,279 MIN_NORMAL,280 ONE,281 MAX_NORMAL,282 INF,283 SIGNALING_NAN,284 QUIET_NAN285};286 287constexpr FP all_fp_values[] = {288 FP::ZERO, FP::MIN_SUBNORMAL, FP::MAX_SUBNORMAL,289 FP::MIN_NORMAL, FP::ONE, FP::MAX_NORMAL,290 FP::INF, FP::SIGNALING_NAN, FP::QUIET_NAN,291};292 293constexpr Sign all_signs[] = {Sign::POS, Sign::NEG};294 295using FPTypes = LIBC_NAMESPACE::testing::TypeList<296 FPRep<FPType::IEEE754_Binary16>, FPRep<FPType::IEEE754_Binary32>,297 FPRep<FPType::IEEE754_Binary64>, FPRep<FPType::IEEE754_Binary128>,298 FPRep<FPType::X86_Binary80>>;299 300template <typename T> constexpr auto make(Sign sign, FP fp) {301 switch (fp) {302 case FP::ZERO:303 return T::zero(sign);304 case FP::MIN_SUBNORMAL:305 return T::min_subnormal(sign);306 case FP::MAX_SUBNORMAL:307 return T::max_subnormal(sign);308 case FP::MIN_NORMAL:309 return T::min_normal(sign);310 case FP::ONE:311 return T::one(sign);312 case FP::MAX_NORMAL:313 return T::max_normal(sign);314 case FP::INF:315 return T::inf(sign);316 case FP::SIGNALING_NAN:317 return T::signaling_nan(sign);318 case FP::QUIET_NAN:319 return T::quiet_nan(sign);320 }321 __builtin_unreachable();322}323 324// Tests all properties for all types of float.325TYPED_TEST(LlvmLibcFPBitsTest, Properties, FPTypes) {326 for (Sign sign : all_signs) {327 for (FP fp : all_fp_values) {328 const T value = make<T>(sign, fp);329 // is_zero330 ASSERT_EQ(value.is_zero(), fp == FP::ZERO);331 // is_inf_or_nan332 ASSERT_EQ(value.is_inf_or_nan(), fp == FP::INF ||333 fp == FP::SIGNALING_NAN ||334 fp == FP::QUIET_NAN);335 // is_finite336 ASSERT_EQ(value.is_finite(), fp != FP::INF && fp != FP::SIGNALING_NAN &&337 fp != FP::QUIET_NAN);338 // is_inf339 ASSERT_EQ(value.is_inf(), fp == FP::INF);340 // is_nan341 ASSERT_EQ(value.is_nan(), fp == FP::SIGNALING_NAN || fp == FP::QUIET_NAN);342 // is_normal343 ASSERT_EQ(value.is_normal(),344 fp == FP::MIN_NORMAL || fp == FP::ONE || fp == FP::MAX_NORMAL);345 // is_quiet_nan346 ASSERT_EQ(value.is_quiet_nan(), fp == FP::QUIET_NAN);347 // is_signaling_nan348 ASSERT_EQ(value.is_signaling_nan(), fp == FP::SIGNALING_NAN);349 // is_subnormal350 ASSERT_EQ(value.is_subnormal(), fp == FP::ZERO ||351 fp == FP::MIN_SUBNORMAL ||352 fp == FP::MAX_SUBNORMAL);353 // is_pos354 ASSERT_EQ(value.is_pos(), sign == Sign::POS);355 ASSERT_EQ(value.sign().is_pos(), sign == Sign::POS);356 // is_neg357 ASSERT_EQ(value.is_neg(), sign == Sign::NEG);358 ASSERT_EQ(value.sign().is_neg(), sign == Sign::NEG);359 }360 }361}362 363#define ASSERT_SAME_REP(A, B) ASSERT_EQ(A.uintval(), B.uintval());364 365TYPED_TEST(LlvmLibcFPBitsTest, NextTowardInf, FPTypes) {366 struct {367 FP before, after;368 } TEST_CASES[] = {369 {FP::ZERO, FP::MIN_SUBNORMAL}, //370 {FP::MAX_SUBNORMAL, FP::MIN_NORMAL}, //371 {FP::MAX_NORMAL, FP::INF}, //372 {FP::INF, FP::INF}, //373 {FP::QUIET_NAN, FP::QUIET_NAN}, //374 {FP::SIGNALING_NAN, FP::SIGNALING_NAN}, //375 };376 for (Sign sign : all_signs) {377 for (auto tc : TEST_CASES) {378 T val = make<T>(sign, tc.before);379 ASSERT_SAME_REP(val.next_toward_inf(), make<T>(sign, tc.after));380 }381 }382}383 384TEST(LlvmLibcFPBitsTest, FloatType) {385 using FloatBits = FPBits<float>;386 387 EXPECT_STREQ(LIBC_NAMESPACE::str(FloatBits::inf(Sign::POS)).c_str(),388 "(+Infinity)");389 EXPECT_STREQ(LIBC_NAMESPACE::str(FloatBits::inf(Sign::NEG)).c_str(),390 "(-Infinity)");391 EXPECT_STREQ(LIBC_NAMESPACE::str(FloatBits::signaling_nan()).c_str(),392 "(NaN)");393 394 FloatBits zero(0.0f);395 EXPECT_TRUE(zero.is_pos());396 EXPECT_EQ(zero.get_biased_exponent(), 0_u16);397 EXPECT_EQ(zero.get_mantissa(), 0_u32);398 EXPECT_EQ(zero.uintval(), 0_u32);399 EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(),400 "0x00000000 = (S: 0, E: 0x0000, M: 0x00000000)");401 402 FloatBits negzero(-0.0f);403 EXPECT_TRUE(negzero.is_neg());404 EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);405 EXPECT_EQ(negzero.get_mantissa(), 0_u32);406 EXPECT_EQ(negzero.uintval(), 0x80000000_u32);407 EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(),408 "0x80000000 = (S: 1, E: 0x0000, M: 0x00000000)");409 410 FloatBits one(1.0f);411 EXPECT_TRUE(one.is_pos());412 EXPECT_EQ(one.get_biased_exponent(), 0x7F_u16);413 EXPECT_EQ(one.get_mantissa(), 0_u32);414 EXPECT_EQ(one.uintval(), 0x3F800000_u32);415 EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(),416 "0x3F800000 = (S: 0, E: 0x007F, M: 0x00000000)");417 418 FloatBits negone(-1.0f);419 EXPECT_TRUE(negone.is_neg());420 EXPECT_EQ(negone.get_biased_exponent(), 0x7F_u16);421 EXPECT_EQ(negone.get_mantissa(), 0_u32);422 EXPECT_EQ(negone.uintval(), 0xBF800000_u32);423 EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(),424 "0xBF800000 = (S: 1, E: 0x007F, M: 0x00000000)");425 426 FloatBits num(1.125f);427 EXPECT_TRUE(num.is_pos());428 EXPECT_EQ(num.get_biased_exponent(), 0x7F_u16);429 EXPECT_EQ(num.get_mantissa(), 0x00100000_u32);430 EXPECT_EQ(num.uintval(), 0x3F900000_u32);431 EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(),432 "0x3F900000 = (S: 0, E: 0x007F, M: 0x00100000)");433 434 FloatBits negnum(-1.125f);435 EXPECT_TRUE(negnum.is_neg());436 EXPECT_EQ(negnum.get_biased_exponent(), 0x7F_u16);437 EXPECT_EQ(negnum.get_mantissa(), 0x00100000_u32);438 EXPECT_EQ(negnum.uintval(), 0xBF900000_u32);439 EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),440 "0xBF900000 = (S: 1, E: 0x007F, M: 0x00100000)");441 442 FloatBits quiet_nan = FloatBits::quiet_nan();443 EXPECT_EQ(quiet_nan.is_quiet_nan(), true);444}445 446TEST(LlvmLibcFPBitsTest, DoubleType) {447 using DoubleBits = FPBits<double>;448 449 EXPECT_STREQ(LIBC_NAMESPACE::str(DoubleBits::inf(Sign::POS)).c_str(),450 "(+Infinity)");451 EXPECT_STREQ(LIBC_NAMESPACE::str(DoubleBits::inf(Sign::NEG)).c_str(),452 "(-Infinity)");453 EXPECT_STREQ(LIBC_NAMESPACE::str(DoubleBits::signaling_nan()).c_str(),454 "(NaN)");455 456 DoubleBits zero(0.0);457 EXPECT_TRUE(zero.is_pos());458 EXPECT_EQ(zero.get_biased_exponent(), 0_u16);459 EXPECT_EQ(zero.get_mantissa(), 0_u64);460 EXPECT_EQ(zero.uintval(), 0_u64);461 EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(),462 "0x0000000000000000 = (S: 0, E: 0x0000, M: 0x0000000000000000)");463 464 DoubleBits negzero(-0.0);465 EXPECT_TRUE(negzero.is_neg());466 EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);467 EXPECT_EQ(negzero.get_mantissa(), 0_u64);468 EXPECT_EQ(negzero.uintval(), 0x8000000000000000_u64);469 EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(),470 "0x8000000000000000 = (S: 1, E: 0x0000, M: 0x0000000000000000)");471 472 DoubleBits one(1.0);473 EXPECT_TRUE(one.is_pos());474 EXPECT_EQ(one.get_biased_exponent(), 0x03FF_u16);475 EXPECT_EQ(one.get_mantissa(), 0_u64);476 EXPECT_EQ(one.uintval(), 0x3FF0000000000000_u64);477 EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(),478 "0x3FF0000000000000 = (S: 0, E: 0x03FF, M: 0x0000000000000000)");479 480 DoubleBits negone(-1.0);481 EXPECT_TRUE(negone.is_neg());482 EXPECT_EQ(negone.get_biased_exponent(), 0x03FF_u16);483 EXPECT_EQ(negone.get_mantissa(), 0_u64);484 EXPECT_EQ(negone.uintval(), 0xBFF0000000000000_u64);485 EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(),486 "0xBFF0000000000000 = (S: 1, E: 0x03FF, M: 0x0000000000000000)");487 488 DoubleBits num(1.125);489 EXPECT_TRUE(num.is_pos());490 EXPECT_EQ(num.get_biased_exponent(), 0x03FF_u16);491 EXPECT_EQ(num.get_mantissa(), 0x0002000000000000_u64);492 EXPECT_EQ(num.uintval(), 0x3FF2000000000000_u64);493 EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(),494 "0x3FF2000000000000 = (S: 0, E: 0x03FF, M: 0x0002000000000000)");495 496 DoubleBits negnum(-1.125);497 EXPECT_TRUE(negnum.is_neg());498 EXPECT_EQ(negnum.get_biased_exponent(), 0x03FF_u16);499 EXPECT_EQ(negnum.get_mantissa(), 0x0002000000000000_u64);500 EXPECT_EQ(negnum.uintval(), 0xBFF2000000000000_u64);501 EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),502 "0xBFF2000000000000 = (S: 1, E: 0x03FF, M: 0x0002000000000000)");503 504 DoubleBits quiet_nan = DoubleBits::quiet_nan();505 EXPECT_EQ(quiet_nan.is_quiet_nan(), true);506}507 508#ifdef LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80509TEST(LlvmLibcFPBitsTest, X86LongDoubleType) {510 using LongDoubleBits = FPBits<long double>;511 using Rep = FPRep<FPType::X86_Binary80>;512 513 EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::POS)).c_str(),514 "(+Infinity)");515 EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::NEG)).c_str(),516 "(-Infinity)");517 EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::signaling_nan()).c_str(),518 "(NaN)");519 520 LongDoubleBits zero(0.0l);521 EXPECT_TRUE(zero.is_pos());522 EXPECT_EQ(zero.get_biased_exponent(), 0_u16);523 EXPECT_EQ(zero.get_mantissa(), LongDoubleBits::StorageType(Rep::zero()));524 EXPECT_EQ(zero.uintval(), LongDoubleBits::StorageType(Rep::zero()));525#if __SIZEOF_LONG_DOUBLE__ == 16526 EXPECT_STREQ(527 LIBC_NAMESPACE::str(zero).c_str(),528 "0x00000000000000000000000000000000 = "529 "(S: 0, E: 0x0000, I: 0, M: 0x00000000000000000000000000000000)");530#elif __SIZEOF_LONG_DOUBLE__ == 12531 EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(),532 "0x000000000000000000000000 = "533 "(S: 0, E: 0x0000, I: 0, M: 0x000000000000000000000000)");534#else535#error "unhandled long double type"536#endif537 538 LongDoubleBits negzero(-0.0l);539 EXPECT_TRUE(negzero.is_neg());540 EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);541 EXPECT_EQ(negzero.get_mantissa(), LongDoubleBits::StorageType(Rep::zero()));542#if __SIZEOF_LONG_DOUBLE__ == 16543 EXPECT_EQ(negzero.uintval(), 0x8000'00000000'00000000_u128);544 EXPECT_STREQ(545 LIBC_NAMESPACE::str(negzero).c_str(),546 "0x00000000000080000000000000000000 = "547 "(S: 1, E: 0x0000, I: 0, M: 0x00000000000000000000000000000000)");548#elif __SIZEOF_LONG_DOUBLE__ == 12549 EXPECT_EQ(negzero.uintval(), 0x8000'00000000'00000000_u96);550 EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(),551 "0x000080000000000000000000 = "552 "(S: 1, E: 0x0000, I: 0, M: 0x000000000000000000000000)");553#else554#error "unhandled long double type"555#endif556 557 LongDoubleBits one(1.0l);558 EXPECT_TRUE(one.is_pos());559 EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16);560 EXPECT_EQ(one.get_mantissa(), LongDoubleBits::StorageType(Rep::zero()));561#if __SIZEOF_LONG_DOUBLE__ == 16562 EXPECT_EQ(one.uintval(), 0x3FFF'80000000'00000000_u128);563 EXPECT_STREQ(564 LIBC_NAMESPACE::str(one).c_str(),565 "0x0000000000003FFF8000000000000000 = "566 "(S: 0, E: 0x3FFF, I: 1, M: 0x00000000000000000000000000000000)");567#elif __SIZEOF_LONG_DOUBLE__ == 12568 EXPECT_EQ(one.uintval(), 0x3FFF'80000000'00000000_u96);569 EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(),570 "0x00003FFF8000000000000000 = "571 "(S: 0, E: 0x3FFF, I: 1, M: 0x000000000000000000000000)");572#else573#error "unhandled long double type"574#endif575 576 LongDoubleBits negone(-1.0l);577 EXPECT_TRUE(negone.is_neg());578 EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16);579 EXPECT_EQ(negone.get_mantissa(), LongDoubleBits::StorageType(Rep::zero()));580#if __SIZEOF_LONG_DOUBLE__ == 16581 EXPECT_EQ(negone.uintval(), 0xBFFF'80000000'00000000_u128);582 EXPECT_STREQ(583 LIBC_NAMESPACE::str(negone).c_str(),584 "0x000000000000BFFF8000000000000000 = "585 "(S: 1, E: 0x3FFF, I: 1, M: 0x00000000000000000000000000000000)");586#elif __SIZEOF_LONG_DOUBLE__ == 12587 EXPECT_EQ(negone.uintval(), 0xBFFF'80000000'00000000_u96);588 EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(),589 "0x0000BFFF8000000000000000 = "590 "(S: 1, E: 0x3FFF, I: 1, M: 0x000000000000000000000000)");591#else592#error "unhandled long double type"593#endif594 595 LongDoubleBits num(1.125l);596 EXPECT_TRUE(num.is_pos());597 EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16);598#if __SIZEOF_LONG_DOUBLE__ == 16599 EXPECT_EQ(num.get_mantissa(), 0x10000000'00000000_u128);600 EXPECT_EQ(num.uintval(), 0x3FFF'90000000'00000000_u128);601 EXPECT_STREQ(602 LIBC_NAMESPACE::str(num).c_str(),603 "0x0000000000003FFF9000000000000000 = "604 "(S: 0, E: 0x3FFF, I: 1, M: 0x00000000000000001000000000000000)");605#elif __SIZEOF_LONG_DOUBLE__ == 12606 EXPECT_EQ(num.get_mantissa(), 0x10000000'00000000_u96);607 EXPECT_EQ(num.uintval(), 0x3FFF'90000000'00000000_u96);608 EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(),609 "0x00003FFF9000000000000000 = "610 "(S: 0, E: 0x3FFF, I: 1, M: 0x000000001000000000000000)");611#else612#error "unhandled long double type"613#endif614 615 LongDoubleBits negnum(-1.125l);616 EXPECT_TRUE(negnum.is_neg());617 EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16);618#if __SIZEOF_LONG_DOUBLE__ == 16619 EXPECT_EQ(negnum.get_mantissa(), 0x10000000'00000000_u128);620 EXPECT_EQ(negnum.uintval(), 0xBFFF'90000000'00000000_u128);621 EXPECT_STREQ(622 LIBC_NAMESPACE::str(negnum).c_str(),623 "0x000000000000BFFF9000000000000000 = "624 "(S: 1, E: 0x3FFF, I: 1, M: 0x00000000000000001000000000000000)");625#elif __SIZEOF_LONG_DOUBLE__ == 12626 EXPECT_EQ(negnum.get_mantissa(), 0x10000000'00000000_u96);627 EXPECT_EQ(negnum.uintval(), 0xBFFF'90000000'00000000_u96);628 EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),629 "0x0000BFFF9000000000000000 = "630 "(S: 1, E: 0x3FFF, I: 1, M: 0x000000001000000000000000)");631#else632#error "unhandled long double type"633#endif634 635 LongDoubleBits quiet_nan = LongDoubleBits::quiet_nan();636 EXPECT_EQ(quiet_nan.is_quiet_nan(), true);637}638#else639TEST(LlvmLibcFPBitsTest, LongDoubleType) {640#if defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)641 return; // The tests for the "double" type cover for this case.642#else643 using LongDoubleBits = FPBits<long double>;644 645 EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::POS)).c_str(),646 "(+Infinity)");647 EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::NEG)).c_str(),648 "(-Infinity)");649 EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::signaling_nan()).c_str(),650 "(NaN)");651 652 LongDoubleBits zero(0.0l);653 EXPECT_TRUE(zero.is_pos());654 EXPECT_EQ(zero.get_biased_exponent(), 0_u16);655 EXPECT_EQ(zero.get_mantissa(), 0_u128);656 EXPECT_EQ(zero.uintval(), 0_u128);657 EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(),658 "0x00000000000000000000000000000000 = "659 "(S: 0, E: 0x0000, M: 0x00000000000000000000000000000000)");660 661 LongDoubleBits negzero(-0.0l);662 EXPECT_TRUE(negzero.is_neg());663 EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);664 EXPECT_EQ(negzero.get_mantissa(), 0_u128);665 EXPECT_EQ(negzero.uintval(), 0x80000000'00000000'00000000'00000000_u128);666 EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(),667 "0x80000000000000000000000000000000 = "668 "(S: 1, E: 0x0000, M: 0x00000000000000000000000000000000)");669 670 LongDoubleBits one(1.0l);671 EXPECT_TRUE(one.is_pos());672 EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16);673 EXPECT_EQ(one.get_mantissa(), 0_u128);674 EXPECT_EQ(one.uintval(), 0x3FFF0000'00000000'00000000'00000000_u128);675 EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(),676 "0x3FFF0000000000000000000000000000 = "677 "(S: 0, E: 0x3FFF, M: 0x00000000000000000000000000000000)");678 679 LongDoubleBits negone(-1.0l);680 EXPECT_TRUE(negone.is_neg());681 EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16);682 EXPECT_EQ(negone.get_mantissa(), 0_u128);683 EXPECT_EQ(negone.uintval(), 0xBFFF0000'00000000'00000000'00000000_u128);684 EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(),685 "0xBFFF0000000000000000000000000000 = "686 "(S: 1, E: 0x3FFF, M: 0x00000000000000000000000000000000)");687 688 LongDoubleBits num(1.125l);689 EXPECT_TRUE(num.is_pos());690 EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16);691 EXPECT_EQ(num.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);692 EXPECT_EQ(num.uintval(), 0x3FFF2000'00000000'00000000'00000000_u128);693 EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(),694 "0x3FFF2000000000000000000000000000 = "695 "(S: 0, E: 0x3FFF, M: 0x00002000000000000000000000000000)");696 697 LongDoubleBits negnum(-1.125l);698 EXPECT_TRUE(negnum.is_neg());699 EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16);700 EXPECT_EQ(negnum.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);701 EXPECT_EQ(negnum.uintval(), 0xBFFF2000'00000000'00000000'00000000_u128);702 EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),703 "0xBFFF2000000000000000000000000000 = "704 "(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)");705 706 LongDoubleBits quiet_nan = LongDoubleBits::quiet_nan();707 EXPECT_EQ(quiet_nan.is_quiet_nan(), true);708#endif709}710#endif711 712#if defined(LIBC_TYPES_HAS_FLOAT128)713TEST(LlvmLibcFPBitsTest, Float128Type) {714 using Float128Bits = FPBits<float128>;715 716 EXPECT_STREQ(LIBC_NAMESPACE::str(Float128Bits::inf(Sign::POS)).c_str(),717 "(+Infinity)");718 EXPECT_STREQ(LIBC_NAMESPACE::str(Float128Bits::inf(Sign::NEG)).c_str(),719 "(-Infinity)");720 EXPECT_STREQ(LIBC_NAMESPACE::str(Float128Bits::signaling_nan()).c_str(),721 "(NaN)");722 723 Float128Bits zero = Float128Bits::zero(Sign::POS);724 EXPECT_TRUE(zero.is_pos());725 EXPECT_EQ(zero.get_biased_exponent(), 0_u16);726 EXPECT_EQ(zero.get_mantissa(), 0_u128);727 EXPECT_EQ(zero.uintval(), 0_u128);728 EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(),729 "0x00000000000000000000000000000000 = "730 "(S: 0, E: 0x0000, M: 0x00000000000000000000000000000000)");731 732 Float128Bits negzero = Float128Bits::zero(Sign::NEG);733 EXPECT_TRUE(negzero.is_neg());734 EXPECT_EQ(negzero.get_biased_exponent(), 0_u16);735 EXPECT_EQ(negzero.get_mantissa(), 0_u128);736 EXPECT_EQ(negzero.uintval(), 0x80000000'00000000'00000000'00000000_u128);737 EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(),738 "0x80000000000000000000000000000000 = "739 "(S: 1, E: 0x0000, M: 0x00000000000000000000000000000000)");740 741 Float128Bits one(float128(1.0));742 EXPECT_TRUE(one.is_pos());743 EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16);744 EXPECT_EQ(one.get_mantissa(), 0_u128);745 EXPECT_EQ(one.uintval(), 0x3FFF0000'00000000'00000000'00000000_u128);746 EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(),747 "0x3FFF0000000000000000000000000000 = "748 "(S: 0, E: 0x3FFF, M: 0x00000000000000000000000000000000)");749 750 Float128Bits negone(float128(-1.0));751 EXPECT_TRUE(negone.is_neg());752 EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16);753 EXPECT_EQ(negone.get_mantissa(), 0_u128);754 EXPECT_EQ(negone.uintval(), 0xBFFF0000'00000000'00000000'00000000_u128);755 EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(),756 "0xBFFF0000000000000000000000000000 = "757 "(S: 1, E: 0x3FFF, M: 0x00000000000000000000000000000000)");758 759 Float128Bits num(float128(1.125));760 EXPECT_TRUE(num.is_pos());761 EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16);762 EXPECT_EQ(num.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);763 EXPECT_EQ(num.uintval(), 0x3FFF2000'00000000'00000000'00000000_u128);764 EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(),765 "0x3FFF2000000000000000000000000000 = "766 "(S: 0, E: 0x3FFF, M: 0x00002000000000000000000000000000)");767 768 Float128Bits negnum(float128(-1.125));769 EXPECT_TRUE(negnum.is_neg());770 EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16);771 EXPECT_EQ(negnum.get_mantissa(), 0x2000'00000000'00000000'00000000_u128);772 EXPECT_EQ(negnum.uintval(), 0xBFFF2000'00000000'00000000'00000000_u128);773 EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),774 "0xBFFF2000000000000000000000000000 = "775 "(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)");776 777 Float128Bits quiet_nan = Float128Bits::quiet_nan();778 EXPECT_EQ(quiet_nan.is_quiet_nan(), true);779}780#endif // LIBC_TYPES_HAS_FLOAT128781