15b079af1SMichael Jones //===-- Unittests for the FPBits class ------------------------------------===// 200bd8e90SSiva Chandra Reddy // 300bd8e90SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 400bd8e90SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 500bd8e90SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 600bd8e90SSiva Chandra Reddy // 700bd8e90SSiva Chandra Reddy //===----------------------------------------------------------------------===// 800bd8e90SSiva Chandra Reddy 900bd8e90SSiva Chandra Reddy #include "src/__support/FPUtil/FPBits.h" 1037458f66STue Ly #include "src/__support/FPUtil/fpbits_str.h" 117302c8dbSNick Desaulniers #include "src/__support/big_int.h" 1203232350SGuillaume Chatelet #include "src/__support/integer_literals.h" 13ded08015SSirui Mu #include "src/__support/macros/properties/types.h" 142137894aSGuillaume Chatelet #include "src/__support/sign.h" // Sign 1500bd8e90SSiva Chandra Reddy #include "test/UnitTest/Test.h" 1600bd8e90SSiva Chandra Reddy 17f6b2a222SMichael Jones using LIBC_NAMESPACE::Sign; 187302c8dbSNick Desaulniers using LIBC_NAMESPACE::UInt; 19b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::fputil::FPBits; 20fd3edd45SGuillaume Chatelet using LIBC_NAMESPACE::fputil::FPType; 21fd3edd45SGuillaume Chatelet using LIBC_NAMESPACE::fputil::internal::FPRep; 2200bd8e90SSiva Chandra Reddy 2303232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u16; 2403232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u32; 2503232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u64; 267302c8dbSNick Desaulniers using LIBC_NAMESPACE::operator""_u96; 2703232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u128; 2803232350SGuillaume Chatelet 295ddd7bc3SGuillaume Chatelet TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary16) { 305ddd7bc3SGuillaume Chatelet using Rep = FPRep<FPType::IEEE754_Binary16>; 311edb43f6SGuillaume Chatelet using u16 = typename Rep::StorageType; 325ddd7bc3SGuillaume Chatelet 3303232350SGuillaume Chatelet EXPECT_EQ(0b0'00000'0000000000_u16, u16(Rep::zero())); 3403232350SGuillaume Chatelet EXPECT_EQ(0b0'01111'0000000000_u16, u16(Rep::one())); 3503232350SGuillaume Chatelet EXPECT_EQ(0b0'00000'0000000001_u16, u16(Rep::min_subnormal())); 3603232350SGuillaume Chatelet EXPECT_EQ(0b0'00000'1111111111_u16, u16(Rep::max_subnormal())); 3703232350SGuillaume Chatelet EXPECT_EQ(0b0'00001'0000000000_u16, u16(Rep::min_normal())); 3803232350SGuillaume Chatelet EXPECT_EQ(0b0'11110'1111111111_u16, u16(Rep::max_normal())); 3903232350SGuillaume Chatelet EXPECT_EQ(0b0'11111'0000000000_u16, u16(Rep::inf())); 4003232350SGuillaume Chatelet EXPECT_EQ(0b0'11111'0100000000_u16, u16(Rep::signaling_nan())); 4103232350SGuillaume Chatelet EXPECT_EQ(0b0'11111'1000000000_u16, u16(Rep::quiet_nan())); 425ddd7bc3SGuillaume Chatelet } 435ddd7bc3SGuillaume Chatelet 445ddd7bc3SGuillaume Chatelet TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary32) { 455ddd7bc3SGuillaume Chatelet using Rep = FPRep<FPType::IEEE754_Binary32>; 461edb43f6SGuillaume Chatelet using u32 = typename Rep::StorageType; 475ddd7bc3SGuillaume Chatelet 4803232350SGuillaume Chatelet EXPECT_EQ(0b0'00000000'00000000000000000000000_u32, u32(Rep::zero())); 4903232350SGuillaume Chatelet EXPECT_EQ(0b0'01111111'00000000000000000000000_u32, u32(Rep::one())); 5003232350SGuillaume Chatelet EXPECT_EQ(0b0'00000000'00000000000000000000001_u32, 511edb43f6SGuillaume Chatelet u32(Rep::min_subnormal())); 5203232350SGuillaume Chatelet EXPECT_EQ(0b0'00000000'11111111111111111111111_u32, 531edb43f6SGuillaume Chatelet u32(Rep::max_subnormal())); 5403232350SGuillaume Chatelet EXPECT_EQ(0b0'00000001'00000000000000000000000_u32, u32(Rep::min_normal())); 5503232350SGuillaume Chatelet EXPECT_EQ(0b0'11111110'11111111111111111111111_u32, u32(Rep::max_normal())); 5603232350SGuillaume Chatelet EXPECT_EQ(0b0'11111111'00000000000000000000000_u32, u32(Rep::inf())); 5703232350SGuillaume Chatelet EXPECT_EQ(0b0'11111111'01000000000000000000000_u32, 58ace383dfSGuillaume Chatelet u32(Rep::signaling_nan())); 5903232350SGuillaume Chatelet EXPECT_EQ(0b0'11111111'10000000000000000000000_u32, u32(Rep::quiet_nan())); 605ddd7bc3SGuillaume Chatelet } 615ddd7bc3SGuillaume Chatelet 625ddd7bc3SGuillaume Chatelet TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary64) { 635ddd7bc3SGuillaume Chatelet using Rep = FPRep<FPType::IEEE754_Binary64>; 641edb43f6SGuillaume Chatelet using u64 = typename Rep::StorageType; 655ddd7bc3SGuillaume Chatelet 665ddd7bc3SGuillaume Chatelet EXPECT_EQ( 6703232350SGuillaume Chatelet 0b0'00000000000'0000000000000000000000000000000000000000000000000000_u64, 681edb43f6SGuillaume Chatelet u64(Rep::zero())); 695ddd7bc3SGuillaume Chatelet EXPECT_EQ( 7003232350SGuillaume Chatelet 0b0'01111111111'0000000000000000000000000000000000000000000000000000_u64, 711edb43f6SGuillaume Chatelet u64(Rep::one())); 725ddd7bc3SGuillaume Chatelet EXPECT_EQ( 7303232350SGuillaume Chatelet 0b0'00000000000'0000000000000000000000000000000000000000000000000001_u64, 741edb43f6SGuillaume Chatelet u64(Rep::min_subnormal())); 755ddd7bc3SGuillaume Chatelet EXPECT_EQ( 7603232350SGuillaume Chatelet 0b0'00000000000'1111111111111111111111111111111111111111111111111111_u64, 771edb43f6SGuillaume Chatelet u64(Rep::max_subnormal())); 785ddd7bc3SGuillaume Chatelet EXPECT_EQ( 7903232350SGuillaume Chatelet 0b0'00000000001'0000000000000000000000000000000000000000000000000000_u64, 801edb43f6SGuillaume Chatelet u64(Rep::min_normal())); 815ddd7bc3SGuillaume Chatelet EXPECT_EQ( 8203232350SGuillaume Chatelet 0b0'11111111110'1111111111111111111111111111111111111111111111111111_u64, 831edb43f6SGuillaume Chatelet u64(Rep::max_normal())); 845ddd7bc3SGuillaume Chatelet EXPECT_EQ( 8503232350SGuillaume Chatelet 0b0'11111111111'0000000000000000000000000000000000000000000000000000_u64, 861edb43f6SGuillaume Chatelet u64(Rep::inf())); 875ddd7bc3SGuillaume Chatelet EXPECT_EQ( 8803232350SGuillaume Chatelet 0b0'11111111111'0100000000000000000000000000000000000000000000000000_u64, 89ace383dfSGuillaume Chatelet u64(Rep::signaling_nan())); 905ddd7bc3SGuillaume Chatelet EXPECT_EQ( 9103232350SGuillaume Chatelet 0b0'11111111111'1000000000000000000000000000000000000000000000000000_u64, 92ace383dfSGuillaume Chatelet u64(Rep::quiet_nan())); 935ddd7bc3SGuillaume Chatelet } 945ddd7bc3SGuillaume Chatelet 951edb43f6SGuillaume Chatelet TEST(LlvmLibcFPBitsTest, FPType_IEEE754_Binary128) { 961edb43f6SGuillaume Chatelet using Rep = FPRep<FPType::IEEE754_Binary128>; 971edb43f6SGuillaume Chatelet 981edb43f6SGuillaume Chatelet EXPECT_EQ( 9903232350SGuillaume Chatelet 0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128, 1001edb43f6SGuillaume Chatelet UInt128(Rep::zero())); 1011edb43f6SGuillaume Chatelet EXPECT_EQ( 10203232350SGuillaume Chatelet 0b0'011111111111111'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128, 1031edb43f6SGuillaume Chatelet UInt128(Rep::one())); 1041edb43f6SGuillaume Chatelet EXPECT_EQ( 10503232350SGuillaume Chatelet 0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001_u128, 1061edb43f6SGuillaume Chatelet UInt128(Rep::min_subnormal())); 1071edb43f6SGuillaume Chatelet EXPECT_EQ( 10803232350SGuillaume Chatelet 0b0'000000000000000'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111_u128, 1091edb43f6SGuillaume Chatelet UInt128(Rep::max_subnormal())); 1101edb43f6SGuillaume Chatelet EXPECT_EQ( 11103232350SGuillaume Chatelet 0b0'000000000000001'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128, 1121edb43f6SGuillaume Chatelet UInt128(Rep::min_normal())); 1131edb43f6SGuillaume Chatelet EXPECT_EQ( 11403232350SGuillaume Chatelet 0b0'111111111111110'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111_u128, 1151edb43f6SGuillaume Chatelet UInt128(Rep::max_normal())); 1161edb43f6SGuillaume Chatelet EXPECT_EQ( 11703232350SGuillaume Chatelet 0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128, 1181edb43f6SGuillaume Chatelet UInt128(Rep::inf())); 1191edb43f6SGuillaume Chatelet EXPECT_EQ( 12003232350SGuillaume Chatelet 0b0'111111111111111'0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128, 121ace383dfSGuillaume Chatelet UInt128(Rep::signaling_nan())); 1221edb43f6SGuillaume Chatelet EXPECT_EQ( 12303232350SGuillaume Chatelet 0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_u128, 124ace383dfSGuillaume Chatelet UInt128(Rep::quiet_nan())); 1251edb43f6SGuillaume Chatelet } 1261edb43f6SGuillaume Chatelet 127*6aa74038SMichael Jones #ifdef LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 1285ddd7bc3SGuillaume Chatelet TEST(LlvmLibcFPBitsTest, FPType_X86_Binary80) { 1295ddd7bc3SGuillaume Chatelet using Rep = FPRep<FPType::X86_Binary80>; 1305ddd7bc3SGuillaume Chatelet 1317302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 1325ddd7bc3SGuillaume Chatelet EXPECT_EQ( 13303232350SGuillaume Chatelet 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000000_u128, 1341edb43f6SGuillaume Chatelet UInt128(Rep::zero())); 1355ddd7bc3SGuillaume Chatelet EXPECT_EQ( 13603232350SGuillaume Chatelet 0b0'0111111111111111000000000000000000000000000000000000000000000000000000000000000_u128, 1371edb43f6SGuillaume Chatelet UInt128(Rep::one())); 1385ddd7bc3SGuillaume Chatelet EXPECT_EQ( 13903232350SGuillaume Chatelet 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000001_u128, 1401edb43f6SGuillaume Chatelet UInt128(Rep::min_subnormal())); 1415ddd7bc3SGuillaume Chatelet EXPECT_EQ( 14203232350SGuillaume Chatelet 0b0'0000000000000000111111111111111111111111111111111111111111111111111111111111111_u128, 1431edb43f6SGuillaume Chatelet UInt128(Rep::max_subnormal())); 1445ddd7bc3SGuillaume Chatelet EXPECT_EQ( 14503232350SGuillaume Chatelet 0b0'0000000000000011000000000000000000000000000000000000000000000000000000000000000_u128, 1461edb43f6SGuillaume Chatelet UInt128(Rep::min_normal())); 1475ddd7bc3SGuillaume Chatelet EXPECT_EQ( 14803232350SGuillaume Chatelet 0b0'1111111111111101111111111111111111111111111111111111111111111111111111111111111_u128, 1491edb43f6SGuillaume Chatelet UInt128(Rep::max_normal())); 1505ddd7bc3SGuillaume Chatelet EXPECT_EQ( 15103232350SGuillaume Chatelet 0b0'1111111111111111000000000000000000000000000000000000000000000000000000000000000_u128, 1521edb43f6SGuillaume Chatelet UInt128(Rep::inf())); 1535ddd7bc3SGuillaume Chatelet EXPECT_EQ( 15403232350SGuillaume Chatelet 0b0'1111111111111111010000000000000000000000000000000000000000000000000000000000000_u128, 155ace383dfSGuillaume Chatelet UInt128(Rep::signaling_nan())); 1565ddd7bc3SGuillaume Chatelet EXPECT_EQ( 15703232350SGuillaume Chatelet 0b0'1111111111111111100000000000000000000000000000000000000000000000000000000000000_u128, 158ace383dfSGuillaume Chatelet UInt128(Rep::quiet_nan())); 1597302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 1607302c8dbSNick Desaulniers EXPECT_EQ( 1617302c8dbSNick Desaulniers 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000000_u96, 1627302c8dbSNick Desaulniers UInt<96>(Rep::zero())); 1637302c8dbSNick Desaulniers EXPECT_EQ( 1647302c8dbSNick Desaulniers 0b0'0111111111111111000000000000000000000000000000000000000000000000000000000000000_u96, 1657302c8dbSNick Desaulniers UInt<96>(Rep::one())); 1667302c8dbSNick Desaulniers EXPECT_EQ( 1677302c8dbSNick Desaulniers 0b0'0000000000000000000000000000000000000000000000000000000000000000000000000000001_u96, 1687302c8dbSNick Desaulniers UInt<96>(Rep::min_subnormal())); 1697302c8dbSNick Desaulniers EXPECT_EQ( 1707302c8dbSNick Desaulniers 0b0'0000000000000000111111111111111111111111111111111111111111111111111111111111111_u96, 1717302c8dbSNick Desaulniers UInt<96>(Rep::max_subnormal())); 1727302c8dbSNick Desaulniers EXPECT_EQ( 1737302c8dbSNick Desaulniers 0b0'0000000000000011000000000000000000000000000000000000000000000000000000000000000_u96, 1747302c8dbSNick Desaulniers UInt<96>(Rep::min_normal())); 1757302c8dbSNick Desaulniers EXPECT_EQ( 1767302c8dbSNick Desaulniers 0b0'1111111111111101111111111111111111111111111111111111111111111111111111111111111_u96, 1777302c8dbSNick Desaulniers UInt<96>(Rep::max_normal())); 1787302c8dbSNick Desaulniers EXPECT_EQ( 1797302c8dbSNick Desaulniers 0b0'1111111111111111000000000000000000000000000000000000000000000000000000000000000_u96, 1807302c8dbSNick Desaulniers UInt<96>(Rep::inf())); 1817302c8dbSNick Desaulniers EXPECT_EQ( 1827302c8dbSNick Desaulniers 0b0'1111111111111111010000000000000000000000000000000000000000000000000000000000000_u96, 1837302c8dbSNick Desaulniers UInt<96>(Rep::signaling_nan())); 1847302c8dbSNick Desaulniers EXPECT_EQ( 1857302c8dbSNick Desaulniers 0b0'1111111111111111100000000000000000000000000000000000000000000000000000000000000_u96, 1867302c8dbSNick Desaulniers UInt<96>(Rep::quiet_nan())); 1877302c8dbSNick Desaulniers #else 1887302c8dbSNick Desaulniers #error "unhandled long double type" 1897302c8dbSNick Desaulniers #endif 1905ddd7bc3SGuillaume Chatelet } 1915ddd7bc3SGuillaume Chatelet 1925ddd7bc3SGuillaume Chatelet TEST(LlvmLibcFPBitsTest, FPType_X86_Binary80_IsNan) { 1935ddd7bc3SGuillaume Chatelet using Rep = FPRep<FPType::X86_Binary80>; 1945ddd7bc3SGuillaume Chatelet 1957302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 19603232350SGuillaume Chatelet EXPECT_TRUE( // NAN : Pseudo-Infinity 19703232350SGuillaume Chatelet Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000000_u128) 19803232350SGuillaume Chatelet .is_nan()); 19903232350SGuillaume Chatelet EXPECT_TRUE( // NAN : Pseudo Not a Number 20003232350SGuillaume Chatelet Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000001_u128) 20103232350SGuillaume Chatelet .is_nan()); 20203232350SGuillaume Chatelet EXPECT_TRUE( // NAN : Pseudo Not a Number 20303232350SGuillaume Chatelet Rep(0b0'111111111111111'0100000000000000000000000000000000000000000000000000000000000000_u128) 20403232350SGuillaume Chatelet .is_nan()); 20503232350SGuillaume Chatelet EXPECT_TRUE( // NAN : Signalling Not a Number 20603232350SGuillaume Chatelet Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000001_u128) 20703232350SGuillaume Chatelet .is_nan()); 20803232350SGuillaume Chatelet EXPECT_TRUE( // NAN : Floating-point Indefinite 20903232350SGuillaume Chatelet Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000000_u128) 21003232350SGuillaume Chatelet .is_nan()); 21103232350SGuillaume Chatelet EXPECT_TRUE( // NAN : Quiet Not a Number 21203232350SGuillaume Chatelet Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000001_u128) 21303232350SGuillaume Chatelet .is_nan()); 21403232350SGuillaume Chatelet EXPECT_TRUE( // NAN : Unnormal 21503232350SGuillaume Chatelet Rep(0b0'111111111111110'0000000000000000000000000000000000000000000000000000000000000000_u128) 21603232350SGuillaume Chatelet .is_nan()); 21703232350SGuillaume Chatelet EXPECT_FALSE( // Zero 21803232350SGuillaume Chatelet Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000_u128) 21903232350SGuillaume Chatelet .is_nan()); 22003232350SGuillaume Chatelet EXPECT_FALSE( // Subnormal 22103232350SGuillaume Chatelet Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000001_u128) 22203232350SGuillaume Chatelet .is_nan()); 22303232350SGuillaume Chatelet EXPECT_FALSE( // Pseudo Denormal 22403232350SGuillaume Chatelet Rep(0b0'000000000000000'1000000000000000000000000000000000000000000000000000000000000001_u128) 22503232350SGuillaume Chatelet .is_nan()); 22603232350SGuillaume Chatelet EXPECT_FALSE( // Infinity 22703232350SGuillaume Chatelet Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000000_u128) 22803232350SGuillaume Chatelet .is_nan()); 22903232350SGuillaume Chatelet EXPECT_FALSE( // Normalized 23003232350SGuillaume Chatelet Rep(0b0'111111111111110'1000000000000000000000000000000000000000000000000000000000000000_u128) 23103232350SGuillaume Chatelet .is_nan()); 2327302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 2337302c8dbSNick Desaulniers EXPECT_TRUE( // NAN : Pseudo-Infinity 2347302c8dbSNick Desaulniers Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000000_u96) 2357302c8dbSNick Desaulniers .is_nan()); 2367302c8dbSNick Desaulniers EXPECT_TRUE( // NAN : Pseudo Not a Number 2377302c8dbSNick Desaulniers Rep(0b0'111111111111111'0000000000000000000000000000000000000000000000000000000000000001_u96) 2387302c8dbSNick Desaulniers .is_nan()); 2397302c8dbSNick Desaulniers EXPECT_TRUE( // NAN : Pseudo Not a Number 2407302c8dbSNick Desaulniers Rep(0b0'111111111111111'0100000000000000000000000000000000000000000000000000000000000000_u96) 2417302c8dbSNick Desaulniers .is_nan()); 2427302c8dbSNick Desaulniers EXPECT_TRUE( // NAN : Signalling Not a Number 2437302c8dbSNick Desaulniers Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000001_u96) 2447302c8dbSNick Desaulniers .is_nan()); 2457302c8dbSNick Desaulniers EXPECT_TRUE( // NAN : Floating-point Indefinite 2467302c8dbSNick Desaulniers Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000000_u96) 2477302c8dbSNick Desaulniers .is_nan()); 2487302c8dbSNick Desaulniers EXPECT_TRUE( // NAN : Quiet Not a Number 2497302c8dbSNick Desaulniers Rep(0b0'111111111111111'1100000000000000000000000000000000000000000000000000000000000001_u96) 2507302c8dbSNick Desaulniers .is_nan()); 2517302c8dbSNick Desaulniers EXPECT_TRUE( // NAN : Unnormal 2527302c8dbSNick Desaulniers Rep(0b0'111111111111110'0000000000000000000000000000000000000000000000000000000000000000_u96) 2537302c8dbSNick Desaulniers .is_nan()); 2547302c8dbSNick Desaulniers EXPECT_FALSE( // Zero 2557302c8dbSNick Desaulniers Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000000_u96) 2567302c8dbSNick Desaulniers .is_nan()); 2577302c8dbSNick Desaulniers EXPECT_FALSE( // Subnormal 2587302c8dbSNick Desaulniers Rep(0b0'000000000000000'0000000000000000000000000000000000000000000000000000000000000001_u96) 2597302c8dbSNick Desaulniers .is_nan()); 2607302c8dbSNick Desaulniers EXPECT_FALSE( // Pseudo Denormal 2617302c8dbSNick Desaulniers Rep(0b0'000000000000000'1000000000000000000000000000000000000000000000000000000000000001_u96) 2627302c8dbSNick Desaulniers .is_nan()); 2637302c8dbSNick Desaulniers EXPECT_FALSE( // Infinity 2647302c8dbSNick Desaulniers Rep(0b0'111111111111111'1000000000000000000000000000000000000000000000000000000000000000_u96) 2657302c8dbSNick Desaulniers .is_nan()); 2667302c8dbSNick Desaulniers EXPECT_FALSE( // Normalized 2677302c8dbSNick Desaulniers Rep(0b0'111111111111110'1000000000000000000000000000000000000000000000000000000000000000_u96) 2687302c8dbSNick Desaulniers .is_nan()); 2697302c8dbSNick Desaulniers #else 2707302c8dbSNick Desaulniers #error "unhandled long double type" 2717302c8dbSNick Desaulniers #endif 2725ddd7bc3SGuillaume Chatelet } 273*6aa74038SMichael Jones #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 2745ddd7bc3SGuillaume Chatelet 275fd3edd45SGuillaume Chatelet enum class FP { 276fd3edd45SGuillaume Chatelet ZERO, 277fd3edd45SGuillaume Chatelet MIN_SUBNORMAL, 278fd3edd45SGuillaume Chatelet MAX_SUBNORMAL, 279fd3edd45SGuillaume Chatelet MIN_NORMAL, 280fd3edd45SGuillaume Chatelet ONE, 281fd3edd45SGuillaume Chatelet MAX_NORMAL, 282fd3edd45SGuillaume Chatelet INF, 283ace383dfSGuillaume Chatelet SIGNALING_NAN, 284ace383dfSGuillaume Chatelet QUIET_NAN 285fd3edd45SGuillaume Chatelet }; 286fd3edd45SGuillaume Chatelet 28725ab2fc0SGuillaume Chatelet constexpr FP all_fp_values[] = { 28825ab2fc0SGuillaume Chatelet FP::ZERO, FP::MIN_SUBNORMAL, FP::MAX_SUBNORMAL, 28925ab2fc0SGuillaume Chatelet FP::MIN_NORMAL, FP::ONE, FP::MAX_NORMAL, 29025ab2fc0SGuillaume Chatelet FP::INF, FP::SIGNALING_NAN, FP::QUIET_NAN, 29125ab2fc0SGuillaume Chatelet }; 29225ab2fc0SGuillaume Chatelet 29325ab2fc0SGuillaume Chatelet constexpr Sign all_signs[] = {Sign::POS, Sign::NEG}; 29425ab2fc0SGuillaume Chatelet 295fd3edd45SGuillaume Chatelet using FPTypes = LIBC_NAMESPACE::testing::TypeList< 296fd3edd45SGuillaume Chatelet FPRep<FPType::IEEE754_Binary16>, FPRep<FPType::IEEE754_Binary32>, 297fd3edd45SGuillaume Chatelet FPRep<FPType::IEEE754_Binary64>, FPRep<FPType::IEEE754_Binary128>, 298fd3edd45SGuillaume Chatelet FPRep<FPType::X86_Binary80>>; 299fd3edd45SGuillaume Chatelet 30025ab2fc0SGuillaume Chatelet template <typename T> constexpr auto make(Sign sign, FP fp) { 301fd3edd45SGuillaume Chatelet switch (fp) { 302fd3edd45SGuillaume Chatelet case FP::ZERO: 303fd3edd45SGuillaume Chatelet return T::zero(sign); 304fd3edd45SGuillaume Chatelet case FP::MIN_SUBNORMAL: 305fd3edd45SGuillaume Chatelet return T::min_subnormal(sign); 306fd3edd45SGuillaume Chatelet case FP::MAX_SUBNORMAL: 307fd3edd45SGuillaume Chatelet return T::max_subnormal(sign); 308fd3edd45SGuillaume Chatelet case FP::MIN_NORMAL: 309fd3edd45SGuillaume Chatelet return T::min_normal(sign); 310fd3edd45SGuillaume Chatelet case FP::ONE: 311fd3edd45SGuillaume Chatelet return T::one(sign); 312fd3edd45SGuillaume Chatelet case FP::MAX_NORMAL: 313fd3edd45SGuillaume Chatelet return T::max_normal(sign); 314fd3edd45SGuillaume Chatelet case FP::INF: 315fd3edd45SGuillaume Chatelet return T::inf(sign); 316ace383dfSGuillaume Chatelet case FP::SIGNALING_NAN: 317ace383dfSGuillaume Chatelet return T::signaling_nan(sign); 318ace383dfSGuillaume Chatelet case FP::QUIET_NAN: 319ace383dfSGuillaume Chatelet return T::quiet_nan(sign); 320fd3edd45SGuillaume Chatelet } 32188f0dc48SOverMighty __builtin_unreachable(); 322e973ab15Slntue } 32325ab2fc0SGuillaume Chatelet 32425ab2fc0SGuillaume Chatelet // Tests all properties for all types of float. 32525ab2fc0SGuillaume Chatelet TYPED_TEST(LlvmLibcFPBitsTest, Properties, FPTypes) { 32625ab2fc0SGuillaume Chatelet for (Sign sign : all_signs) { 32725ab2fc0SGuillaume Chatelet for (FP fp : all_fp_values) { 32825ab2fc0SGuillaume Chatelet const T value = make<T>(sign, fp); 329fd3edd45SGuillaume Chatelet // is_zero 330fd3edd45SGuillaume Chatelet ASSERT_EQ(value.is_zero(), fp == FP::ZERO); 331fd3edd45SGuillaume Chatelet // is_inf_or_nan 332ace383dfSGuillaume Chatelet ASSERT_EQ(value.is_inf_or_nan(), fp == FP::INF || 333ace383dfSGuillaume Chatelet fp == FP::SIGNALING_NAN || 334ace383dfSGuillaume Chatelet fp == FP::QUIET_NAN); 335fd3edd45SGuillaume Chatelet // is_finite 336ace383dfSGuillaume Chatelet ASSERT_EQ(value.is_finite(), fp != FP::INF && fp != FP::SIGNALING_NAN && 337ace383dfSGuillaume Chatelet fp != FP::QUIET_NAN); 338fd3edd45SGuillaume Chatelet // is_inf 339fd3edd45SGuillaume Chatelet ASSERT_EQ(value.is_inf(), fp == FP::INF); 340fd3edd45SGuillaume Chatelet // is_nan 341ace383dfSGuillaume Chatelet ASSERT_EQ(value.is_nan(), fp == FP::SIGNALING_NAN || fp == FP::QUIET_NAN); 342fd3edd45SGuillaume Chatelet // is_normal 343fd3edd45SGuillaume Chatelet ASSERT_EQ(value.is_normal(), 344fd3edd45SGuillaume Chatelet fp == FP::MIN_NORMAL || fp == FP::ONE || fp == FP::MAX_NORMAL); 345fd3edd45SGuillaume Chatelet // is_quiet_nan 346ace383dfSGuillaume Chatelet ASSERT_EQ(value.is_quiet_nan(), fp == FP::QUIET_NAN); 347fd3edd45SGuillaume Chatelet // is_signaling_nan 348ace383dfSGuillaume Chatelet ASSERT_EQ(value.is_signaling_nan(), fp == FP::SIGNALING_NAN); 349fd3edd45SGuillaume Chatelet // is_subnormal 350fd3edd45SGuillaume Chatelet ASSERT_EQ(value.is_subnormal(), fp == FP::ZERO || 351fd3edd45SGuillaume Chatelet fp == FP::MIN_SUBNORMAL || 352fd3edd45SGuillaume Chatelet fp == FP::MAX_SUBNORMAL); 353fd3edd45SGuillaume Chatelet // is_pos 354fd3edd45SGuillaume Chatelet ASSERT_EQ(value.is_pos(), sign == Sign::POS); 355fd3edd45SGuillaume Chatelet ASSERT_EQ(value.sign().is_pos(), sign == Sign::POS); 356fd3edd45SGuillaume Chatelet // is_neg 357fd3edd45SGuillaume Chatelet ASSERT_EQ(value.is_neg(), sign == Sign::NEG); 358fd3edd45SGuillaume Chatelet ASSERT_EQ(value.sign().is_neg(), sign == Sign::NEG); 359fd3edd45SGuillaume Chatelet } 360fd3edd45SGuillaume Chatelet } 361fd3edd45SGuillaume Chatelet } 362fd3edd45SGuillaume Chatelet 363b05ba231SGuillaume Chatelet #define ASSERT_SAME_REP(A, B) ASSERT_EQ(A.uintval(), B.uintval()); 364b05ba231SGuillaume Chatelet 365b05ba231SGuillaume Chatelet TYPED_TEST(LlvmLibcFPBitsTest, NextTowardInf, FPTypes) { 366b05ba231SGuillaume Chatelet struct { 367b05ba231SGuillaume Chatelet FP before, after; 368b05ba231SGuillaume Chatelet } TEST_CASES[] = { 369b05ba231SGuillaume Chatelet {FP::ZERO, FP::MIN_SUBNORMAL}, // 370b05ba231SGuillaume Chatelet {FP::MAX_SUBNORMAL, FP::MIN_NORMAL}, // 371b05ba231SGuillaume Chatelet {FP::MAX_NORMAL, FP::INF}, // 372b05ba231SGuillaume Chatelet {FP::INF, FP::INF}, // 373b05ba231SGuillaume Chatelet {FP::QUIET_NAN, FP::QUIET_NAN}, // 374b05ba231SGuillaume Chatelet {FP::SIGNALING_NAN, FP::SIGNALING_NAN}, // 375b05ba231SGuillaume Chatelet }; 376b05ba231SGuillaume Chatelet for (Sign sign : all_signs) { 377b05ba231SGuillaume Chatelet for (auto tc : TEST_CASES) { 378b05ba231SGuillaume Chatelet T val = make<T>(sign, tc.before); 379b05ba231SGuillaume Chatelet ASSERT_SAME_REP(val.next_toward_inf(), make<T>(sign, tc.after)); 380b05ba231SGuillaume Chatelet } 381b05ba231SGuillaume Chatelet } 382b05ba231SGuillaume Chatelet } 383b05ba231SGuillaume Chatelet 38400bd8e90SSiva Chandra Reddy TEST(LlvmLibcFPBitsTest, FloatType) { 385d2361b20Slntue using FloatBits = FPBits<float>; 386d2361b20Slntue 3876b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(FloatBits::inf(Sign::POS)).c_str(), 388b6bc9d72SGuillaume Chatelet "(+Infinity)"); 3896b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(FloatBits::inf(Sign::NEG)).c_str(), 39037458f66STue Ly "(-Infinity)"); 391ace383dfSGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(FloatBits::signaling_nan()).c_str(), 392ace383dfSGuillaume Chatelet "(NaN)"); 39300bd8e90SSiva Chandra Reddy 394d2361b20Slntue FloatBits zero(0.0f); 39511ec512fSGuillaume Chatelet EXPECT_TRUE(zero.is_pos()); 39603232350SGuillaume Chatelet EXPECT_EQ(zero.get_biased_exponent(), 0_u16); 39703232350SGuillaume Chatelet EXPECT_EQ(zero.get_mantissa(), 0_u32); 39803232350SGuillaume Chatelet EXPECT_EQ(zero.uintval(), 0_u32); 399b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(), 40000bd8e90SSiva Chandra Reddy "0x00000000 = (S: 0, E: 0x0000, M: 0x00000000)"); 40100bd8e90SSiva Chandra Reddy 402d2361b20Slntue FloatBits negzero(-0.0f); 40311ec512fSGuillaume Chatelet EXPECT_TRUE(negzero.is_neg()); 40403232350SGuillaume Chatelet EXPECT_EQ(negzero.get_biased_exponent(), 0_u16); 40503232350SGuillaume Chatelet EXPECT_EQ(negzero.get_mantissa(), 0_u32); 40603232350SGuillaume Chatelet EXPECT_EQ(negzero.uintval(), 0x80000000_u32); 407b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(), 40800bd8e90SSiva Chandra Reddy "0x80000000 = (S: 1, E: 0x0000, M: 0x00000000)"); 40900bd8e90SSiva Chandra Reddy 410d2361b20Slntue FloatBits one(1.0f); 41111ec512fSGuillaume Chatelet EXPECT_TRUE(one.is_pos()); 41203232350SGuillaume Chatelet EXPECT_EQ(one.get_biased_exponent(), 0x7F_u16); 41303232350SGuillaume Chatelet EXPECT_EQ(one.get_mantissa(), 0_u32); 41403232350SGuillaume Chatelet EXPECT_EQ(one.uintval(), 0x3F800000_u32); 415b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(), 41600bd8e90SSiva Chandra Reddy "0x3F800000 = (S: 0, E: 0x007F, M: 0x00000000)"); 41700bd8e90SSiva Chandra Reddy 418d2361b20Slntue FloatBits negone(-1.0f); 41911ec512fSGuillaume Chatelet EXPECT_TRUE(negone.is_neg()); 42003232350SGuillaume Chatelet EXPECT_EQ(negone.get_biased_exponent(), 0x7F_u16); 42103232350SGuillaume Chatelet EXPECT_EQ(negone.get_mantissa(), 0_u32); 42203232350SGuillaume Chatelet EXPECT_EQ(negone.uintval(), 0xBF800000_u32); 423b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(), 42400bd8e90SSiva Chandra Reddy "0xBF800000 = (S: 1, E: 0x007F, M: 0x00000000)"); 42500bd8e90SSiva Chandra Reddy 426d2361b20Slntue FloatBits num(1.125f); 42711ec512fSGuillaume Chatelet EXPECT_TRUE(num.is_pos()); 42803232350SGuillaume Chatelet EXPECT_EQ(num.get_biased_exponent(), 0x7F_u16); 42903232350SGuillaume Chatelet EXPECT_EQ(num.get_mantissa(), 0x00100000_u32); 43003232350SGuillaume Chatelet EXPECT_EQ(num.uintval(), 0x3F900000_u32); 431b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(), 43200bd8e90SSiva Chandra Reddy "0x3F900000 = (S: 0, E: 0x007F, M: 0x00100000)"); 43300bd8e90SSiva Chandra Reddy 434d2361b20Slntue FloatBits negnum(-1.125f); 43511ec512fSGuillaume Chatelet EXPECT_TRUE(negnum.is_neg()); 43603232350SGuillaume Chatelet EXPECT_EQ(negnum.get_biased_exponent(), 0x7F_u16); 43703232350SGuillaume Chatelet EXPECT_EQ(negnum.get_mantissa(), 0x00100000_u32); 43803232350SGuillaume Chatelet EXPECT_EQ(negnum.uintval(), 0xBF900000_u32); 439b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(), 44000bd8e90SSiva Chandra Reddy "0xBF900000 = (S: 1, E: 0x007F, M: 0x00100000)"); 44179a2e2b9SNishant Mittal 442ace383dfSGuillaume Chatelet FloatBits quiet_nan = FloatBits::quiet_nan(); 44379a2e2b9SNishant Mittal EXPECT_EQ(quiet_nan.is_quiet_nan(), true); 44400bd8e90SSiva Chandra Reddy } 44500bd8e90SSiva Chandra Reddy 44600bd8e90SSiva Chandra Reddy TEST(LlvmLibcFPBitsTest, DoubleType) { 447d2361b20Slntue using DoubleBits = FPBits<double>; 448d2361b20Slntue 4496b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(DoubleBits::inf(Sign::POS)).c_str(), 450b6bc9d72SGuillaume Chatelet "(+Infinity)"); 4516b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(DoubleBits::inf(Sign::NEG)).c_str(), 45237458f66STue Ly "(-Infinity)"); 453ace383dfSGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(DoubleBits::signaling_nan()).c_str(), 454ace383dfSGuillaume Chatelet "(NaN)"); 45500bd8e90SSiva Chandra Reddy 456d2361b20Slntue DoubleBits zero(0.0); 45711ec512fSGuillaume Chatelet EXPECT_TRUE(zero.is_pos()); 45803232350SGuillaume Chatelet EXPECT_EQ(zero.get_biased_exponent(), 0_u16); 45903232350SGuillaume Chatelet EXPECT_EQ(zero.get_mantissa(), 0_u64); 46003232350SGuillaume Chatelet EXPECT_EQ(zero.uintval(), 0_u64); 461b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(), 46200bd8e90SSiva Chandra Reddy "0x0000000000000000 = (S: 0, E: 0x0000, M: 0x0000000000000000)"); 46300bd8e90SSiva Chandra Reddy 464d2361b20Slntue DoubleBits negzero(-0.0); 46511ec512fSGuillaume Chatelet EXPECT_TRUE(negzero.is_neg()); 46603232350SGuillaume Chatelet EXPECT_EQ(negzero.get_biased_exponent(), 0_u16); 46703232350SGuillaume Chatelet EXPECT_EQ(negzero.get_mantissa(), 0_u64); 46803232350SGuillaume Chatelet EXPECT_EQ(negzero.uintval(), 0x8000000000000000_u64); 469b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(), 47000bd8e90SSiva Chandra Reddy "0x8000000000000000 = (S: 1, E: 0x0000, M: 0x0000000000000000)"); 47100bd8e90SSiva Chandra Reddy 472d2361b20Slntue DoubleBits one(1.0); 47311ec512fSGuillaume Chatelet EXPECT_TRUE(one.is_pos()); 47403232350SGuillaume Chatelet EXPECT_EQ(one.get_biased_exponent(), 0x03FF_u16); 47503232350SGuillaume Chatelet EXPECT_EQ(one.get_mantissa(), 0_u64); 47603232350SGuillaume Chatelet EXPECT_EQ(one.uintval(), 0x3FF0000000000000_u64); 477b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(), 47800bd8e90SSiva Chandra Reddy "0x3FF0000000000000 = (S: 0, E: 0x03FF, M: 0x0000000000000000)"); 47900bd8e90SSiva Chandra Reddy 480d2361b20Slntue DoubleBits negone(-1.0); 48111ec512fSGuillaume Chatelet EXPECT_TRUE(negone.is_neg()); 48203232350SGuillaume Chatelet EXPECT_EQ(negone.get_biased_exponent(), 0x03FF_u16); 48303232350SGuillaume Chatelet EXPECT_EQ(negone.get_mantissa(), 0_u64); 48403232350SGuillaume Chatelet EXPECT_EQ(negone.uintval(), 0xBFF0000000000000_u64); 485b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(), 48600bd8e90SSiva Chandra Reddy "0xBFF0000000000000 = (S: 1, E: 0x03FF, M: 0x0000000000000000)"); 48700bd8e90SSiva Chandra Reddy 488d2361b20Slntue DoubleBits num(1.125); 48911ec512fSGuillaume Chatelet EXPECT_TRUE(num.is_pos()); 49003232350SGuillaume Chatelet EXPECT_EQ(num.get_biased_exponent(), 0x03FF_u16); 49103232350SGuillaume Chatelet EXPECT_EQ(num.get_mantissa(), 0x0002000000000000_u64); 49203232350SGuillaume Chatelet EXPECT_EQ(num.uintval(), 0x3FF2000000000000_u64); 493b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(), 49400bd8e90SSiva Chandra Reddy "0x3FF2000000000000 = (S: 0, E: 0x03FF, M: 0x0002000000000000)"); 49500bd8e90SSiva Chandra Reddy 496d2361b20Slntue DoubleBits negnum(-1.125); 49711ec512fSGuillaume Chatelet EXPECT_TRUE(negnum.is_neg()); 49803232350SGuillaume Chatelet EXPECT_EQ(negnum.get_biased_exponent(), 0x03FF_u16); 49903232350SGuillaume Chatelet EXPECT_EQ(negnum.get_mantissa(), 0x0002000000000000_u64); 50003232350SGuillaume Chatelet EXPECT_EQ(negnum.uintval(), 0xBFF2000000000000_u64); 501b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(), 50200bd8e90SSiva Chandra Reddy "0xBFF2000000000000 = (S: 1, E: 0x03FF, M: 0x0002000000000000)"); 50379a2e2b9SNishant Mittal 504ace383dfSGuillaume Chatelet DoubleBits quiet_nan = DoubleBits::quiet_nan(); 50579a2e2b9SNishant Mittal EXPECT_EQ(quiet_nan.is_quiet_nan(), true); 50600bd8e90SSiva Chandra Reddy } 50700bd8e90SSiva Chandra Reddy 508ded08015SSirui Mu #ifdef LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 50900bd8e90SSiva Chandra Reddy TEST(LlvmLibcFPBitsTest, X86LongDoubleType) { 510d2361b20Slntue using LongDoubleBits = FPBits<long double>; 5117302c8dbSNick Desaulniers using Rep = FPRep<FPType::X86_Binary80>; 512d2361b20Slntue 5136b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::POS)).c_str(), 51437458f66STue Ly "(+Infinity)"); 5156b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::NEG)).c_str(), 51637458f66STue Ly "(-Infinity)"); 517ace383dfSGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::signaling_nan()).c_str(), 51800bd8e90SSiva Chandra Reddy "(NaN)"); 51900bd8e90SSiva Chandra Reddy 520d2361b20Slntue LongDoubleBits zero(0.0l); 52111ec512fSGuillaume Chatelet EXPECT_TRUE(zero.is_pos()); 52203232350SGuillaume Chatelet EXPECT_EQ(zero.get_biased_exponent(), 0_u16); 5237302c8dbSNick Desaulniers EXPECT_EQ(zero.get_mantissa(), LongDoubleBits::StorageType(Rep::zero())); 5247302c8dbSNick Desaulniers EXPECT_EQ(zero.uintval(), LongDoubleBits::StorageType(Rep::zero())); 5257302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 52600bd8e90SSiva Chandra Reddy EXPECT_STREQ( 527b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::str(zero).c_str(), 52800bd8e90SSiva Chandra Reddy "0x00000000000000000000000000000000 = " 52900bd8e90SSiva Chandra Reddy "(S: 0, E: 0x0000, I: 0, M: 0x00000000000000000000000000000000)"); 5307302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 5317302c8dbSNick Desaulniers EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(), 5327302c8dbSNick Desaulniers "0x000000000000000000000000 = " 5337302c8dbSNick Desaulniers "(S: 0, E: 0x0000, I: 0, M: 0x000000000000000000000000)"); 5347302c8dbSNick Desaulniers #else 5357302c8dbSNick Desaulniers #error "unhandled long double type" 5367302c8dbSNick Desaulniers #endif 53700bd8e90SSiva Chandra Reddy 538d2361b20Slntue LongDoubleBits negzero(-0.0l); 53911ec512fSGuillaume Chatelet EXPECT_TRUE(negzero.is_neg()); 54003232350SGuillaume Chatelet EXPECT_EQ(negzero.get_biased_exponent(), 0_u16); 5417302c8dbSNick Desaulniers EXPECT_EQ(negzero.get_mantissa(), LongDoubleBits::StorageType(Rep::zero())); 5427302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 543a80a01fcSGuillaume Chatelet EXPECT_EQ(negzero.uintval(), 0x8000'00000000'00000000_u128); 54400bd8e90SSiva Chandra Reddy EXPECT_STREQ( 545b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::str(negzero).c_str(), 54600bd8e90SSiva Chandra Reddy "0x00000000000080000000000000000000 = " 54700bd8e90SSiva Chandra Reddy "(S: 1, E: 0x0000, I: 0, M: 0x00000000000000000000000000000000)"); 5487302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 5497302c8dbSNick Desaulniers EXPECT_EQ(negzero.uintval(), 0x8000'00000000'00000000_u96); 5507302c8dbSNick Desaulniers EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(), 5517302c8dbSNick Desaulniers "0x000080000000000000000000 = " 5527302c8dbSNick Desaulniers "(S: 1, E: 0x0000, I: 0, M: 0x000000000000000000000000)"); 5537302c8dbSNick Desaulniers #else 5547302c8dbSNick Desaulniers #error "unhandled long double type" 5557302c8dbSNick Desaulniers #endif 55600bd8e90SSiva Chandra Reddy 557d2361b20Slntue LongDoubleBits one(1.0l); 55811ec512fSGuillaume Chatelet EXPECT_TRUE(one.is_pos()); 55903232350SGuillaume Chatelet EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16); 5607302c8dbSNick Desaulniers EXPECT_EQ(one.get_mantissa(), LongDoubleBits::StorageType(Rep::zero())); 5617302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 562a80a01fcSGuillaume Chatelet EXPECT_EQ(one.uintval(), 0x3FFF'80000000'00000000_u128); 56300bd8e90SSiva Chandra Reddy EXPECT_STREQ( 564b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::str(one).c_str(), 56500bd8e90SSiva Chandra Reddy "0x0000000000003FFF8000000000000000 = " 56600bd8e90SSiva Chandra Reddy "(S: 0, E: 0x3FFF, I: 1, M: 0x00000000000000000000000000000000)"); 5677302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 5687302c8dbSNick Desaulniers EXPECT_EQ(one.uintval(), 0x3FFF'80000000'00000000_u96); 5697302c8dbSNick Desaulniers EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(), 5707302c8dbSNick Desaulniers "0x00003FFF8000000000000000 = " 5717302c8dbSNick Desaulniers "(S: 0, E: 0x3FFF, I: 1, M: 0x000000000000000000000000)"); 5727302c8dbSNick Desaulniers #else 5737302c8dbSNick Desaulniers #error "unhandled long double type" 5747302c8dbSNick Desaulniers #endif 57500bd8e90SSiva Chandra Reddy 576d2361b20Slntue LongDoubleBits negone(-1.0l); 57711ec512fSGuillaume Chatelet EXPECT_TRUE(negone.is_neg()); 57803232350SGuillaume Chatelet EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16); 5797302c8dbSNick Desaulniers EXPECT_EQ(negone.get_mantissa(), LongDoubleBits::StorageType(Rep::zero())); 5807302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 581a80a01fcSGuillaume Chatelet EXPECT_EQ(negone.uintval(), 0xBFFF'80000000'00000000_u128); 58200bd8e90SSiva Chandra Reddy EXPECT_STREQ( 583b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::str(negone).c_str(), 58400bd8e90SSiva Chandra Reddy "0x000000000000BFFF8000000000000000 = " 58500bd8e90SSiva Chandra Reddy "(S: 1, E: 0x3FFF, I: 1, M: 0x00000000000000000000000000000000)"); 5867302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 5877302c8dbSNick Desaulniers EXPECT_EQ(negone.uintval(), 0xBFFF'80000000'00000000_u96); 5887302c8dbSNick Desaulniers EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(), 5897302c8dbSNick Desaulniers "0x0000BFFF8000000000000000 = " 5907302c8dbSNick Desaulniers "(S: 1, E: 0x3FFF, I: 1, M: 0x000000000000000000000000)"); 5917302c8dbSNick Desaulniers #else 5927302c8dbSNick Desaulniers #error "unhandled long double type" 5937302c8dbSNick Desaulniers #endif 59400bd8e90SSiva Chandra Reddy 595d2361b20Slntue LongDoubleBits num(1.125l); 59611ec512fSGuillaume Chatelet EXPECT_TRUE(num.is_pos()); 59703232350SGuillaume Chatelet EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16); 5987302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 599a80a01fcSGuillaume Chatelet EXPECT_EQ(num.get_mantissa(), 0x10000000'00000000_u128); 600a80a01fcSGuillaume Chatelet EXPECT_EQ(num.uintval(), 0x3FFF'90000000'00000000_u128); 60100bd8e90SSiva Chandra Reddy EXPECT_STREQ( 602b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::str(num).c_str(), 60300bd8e90SSiva Chandra Reddy "0x0000000000003FFF9000000000000000 = " 60400bd8e90SSiva Chandra Reddy "(S: 0, E: 0x3FFF, I: 1, M: 0x00000000000000001000000000000000)"); 6057302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 6067302c8dbSNick Desaulniers EXPECT_EQ(num.get_mantissa(), 0x10000000'00000000_u96); 6077302c8dbSNick Desaulniers EXPECT_EQ(num.uintval(), 0x3FFF'90000000'00000000_u96); 6087302c8dbSNick Desaulniers EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(), 6097302c8dbSNick Desaulniers "0x00003FFF9000000000000000 = " 6107302c8dbSNick Desaulniers "(S: 0, E: 0x3FFF, I: 1, M: 0x000000001000000000000000)"); 6117302c8dbSNick Desaulniers #else 6127302c8dbSNick Desaulniers #error "unhandled long double type" 6137302c8dbSNick Desaulniers #endif 61400bd8e90SSiva Chandra Reddy 615d2361b20Slntue LongDoubleBits negnum(-1.125l); 61611ec512fSGuillaume Chatelet EXPECT_TRUE(negnum.is_neg()); 61703232350SGuillaume Chatelet EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16); 6187302c8dbSNick Desaulniers #if __SIZEOF_LONG_DOUBLE__ == 16 619a80a01fcSGuillaume Chatelet EXPECT_EQ(negnum.get_mantissa(), 0x10000000'00000000_u128); 620a80a01fcSGuillaume Chatelet EXPECT_EQ(negnum.uintval(), 0xBFFF'90000000'00000000_u128); 62100bd8e90SSiva Chandra Reddy EXPECT_STREQ( 622b6bc9d72SGuillaume Chatelet LIBC_NAMESPACE::str(negnum).c_str(), 62300bd8e90SSiva Chandra Reddy "0x000000000000BFFF9000000000000000 = " 62400bd8e90SSiva Chandra Reddy "(S: 1, E: 0x3FFF, I: 1, M: 0x00000000000000001000000000000000)"); 6257302c8dbSNick Desaulniers #elif __SIZEOF_LONG_DOUBLE__ == 12 6267302c8dbSNick Desaulniers EXPECT_EQ(negnum.get_mantissa(), 0x10000000'00000000_u96); 6277302c8dbSNick Desaulniers EXPECT_EQ(negnum.uintval(), 0xBFFF'90000000'00000000_u96); 6287302c8dbSNick Desaulniers EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(), 6297302c8dbSNick Desaulniers "0x0000BFFF9000000000000000 = " 6307302c8dbSNick Desaulniers "(S: 1, E: 0x3FFF, I: 1, M: 0x000000001000000000000000)"); 6317302c8dbSNick Desaulniers #else 6327302c8dbSNick Desaulniers #error "unhandled long double type" 6337302c8dbSNick Desaulniers #endif 63479a2e2b9SNishant Mittal 635ace383dfSGuillaume Chatelet LongDoubleBits quiet_nan = LongDoubleBits::quiet_nan(); 63679a2e2b9SNishant Mittal EXPECT_EQ(quiet_nan.is_quiet_nan(), true); 63700bd8e90SSiva Chandra Reddy } 63800bd8e90SSiva Chandra Reddy #else 63900bd8e90SSiva Chandra Reddy TEST(LlvmLibcFPBitsTest, LongDoubleType) { 640f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 64100bd8e90SSiva Chandra Reddy return; // The tests for the "double" type cover for this case. 6422ac91712SJoseph Huber #else 643d2361b20Slntue using LongDoubleBits = FPBits<long double>; 644d2361b20Slntue 6456b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::POS)).c_str(), 64637458f66STue Ly "(+Infinity)"); 6476b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::inf(Sign::NEG)).c_str(), 64837458f66STue Ly "(-Infinity)"); 649ace383dfSGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(LongDoubleBits::signaling_nan()).c_str(), 65000bd8e90SSiva Chandra Reddy "(NaN)"); 65100bd8e90SSiva Chandra Reddy 652d2361b20Slntue LongDoubleBits zero(0.0l); 65311ec512fSGuillaume Chatelet EXPECT_TRUE(zero.is_pos()); 65403232350SGuillaume Chatelet EXPECT_EQ(zero.get_biased_exponent(), 0_u16); 65503232350SGuillaume Chatelet EXPECT_EQ(zero.get_mantissa(), 0_u128); 65603232350SGuillaume Chatelet EXPECT_EQ(zero.uintval(), 0_u128); 657b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(), 65800bd8e90SSiva Chandra Reddy "0x00000000000000000000000000000000 = " 65900bd8e90SSiva Chandra Reddy "(S: 0, E: 0x0000, M: 0x00000000000000000000000000000000)"); 66000bd8e90SSiva Chandra Reddy 661d2361b20Slntue LongDoubleBits negzero(-0.0l); 66211ec512fSGuillaume Chatelet EXPECT_TRUE(negzero.is_neg()); 66303232350SGuillaume Chatelet EXPECT_EQ(negzero.get_biased_exponent(), 0_u16); 66403232350SGuillaume Chatelet EXPECT_EQ(negzero.get_mantissa(), 0_u128); 665a80a01fcSGuillaume Chatelet EXPECT_EQ(negzero.uintval(), 0x80000000'00000000'00000000'00000000_u128); 666b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(), 66700bd8e90SSiva Chandra Reddy "0x80000000000000000000000000000000 = " 66800bd8e90SSiva Chandra Reddy "(S: 1, E: 0x0000, M: 0x00000000000000000000000000000000)"); 66900bd8e90SSiva Chandra Reddy 670d2361b20Slntue LongDoubleBits one(1.0l); 67111ec512fSGuillaume Chatelet EXPECT_TRUE(one.is_pos()); 67203232350SGuillaume Chatelet EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16); 67303232350SGuillaume Chatelet EXPECT_EQ(one.get_mantissa(), 0_u128); 674a80a01fcSGuillaume Chatelet EXPECT_EQ(one.uintval(), 0x3FFF0000'00000000'00000000'00000000_u128); 675b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(), 67600bd8e90SSiva Chandra Reddy "0x3FFF0000000000000000000000000000 = " 67700bd8e90SSiva Chandra Reddy "(S: 0, E: 0x3FFF, M: 0x00000000000000000000000000000000)"); 67800bd8e90SSiva Chandra Reddy 679d2361b20Slntue LongDoubleBits negone(-1.0l); 68011ec512fSGuillaume Chatelet EXPECT_TRUE(negone.is_neg()); 68103232350SGuillaume Chatelet EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16); 68203232350SGuillaume Chatelet EXPECT_EQ(negone.get_mantissa(), 0_u128); 683a80a01fcSGuillaume Chatelet EXPECT_EQ(negone.uintval(), 0xBFFF0000'00000000'00000000'00000000_u128); 684b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(), 68500bd8e90SSiva Chandra Reddy "0xBFFF0000000000000000000000000000 = " 68600bd8e90SSiva Chandra Reddy "(S: 1, E: 0x3FFF, M: 0x00000000000000000000000000000000)"); 68700bd8e90SSiva Chandra Reddy 688d2361b20Slntue LongDoubleBits num(1.125l); 68911ec512fSGuillaume Chatelet EXPECT_TRUE(num.is_pos()); 69003232350SGuillaume Chatelet EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16); 691a80a01fcSGuillaume Chatelet EXPECT_EQ(num.get_mantissa(), 0x2000'00000000'00000000'00000000_u128); 692a80a01fcSGuillaume Chatelet EXPECT_EQ(num.uintval(), 0x3FFF2000'00000000'00000000'00000000_u128); 693b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(), 69400bd8e90SSiva Chandra Reddy "0x3FFF2000000000000000000000000000 = " 69500bd8e90SSiva Chandra Reddy "(S: 0, E: 0x3FFF, M: 0x00002000000000000000000000000000)"); 69600bd8e90SSiva Chandra Reddy 697d2361b20Slntue LongDoubleBits negnum(-1.125l); 69811ec512fSGuillaume Chatelet EXPECT_TRUE(negnum.is_neg()); 69903232350SGuillaume Chatelet EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16); 700a80a01fcSGuillaume Chatelet EXPECT_EQ(negnum.get_mantissa(), 0x2000'00000000'00000000'00000000_u128); 701a80a01fcSGuillaume Chatelet EXPECT_EQ(negnum.uintval(), 0xBFFF2000'00000000'00000000'00000000_u128); 702b6bc9d72SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(), 70300bd8e90SSiva Chandra Reddy "0xBFFF2000000000000000000000000000 = " 70400bd8e90SSiva Chandra Reddy "(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)"); 70579a2e2b9SNishant Mittal 706ace383dfSGuillaume Chatelet LongDoubleBits quiet_nan = LongDoubleBits::quiet_nan(); 70779a2e2b9SNishant Mittal EXPECT_EQ(quiet_nan.is_quiet_nan(), true); 7082ac91712SJoseph Huber #endif 70900bd8e90SSiva Chandra Reddy } 71000bd8e90SSiva Chandra Reddy #endif 7113f906f51Slntue 71275fb825bSGuillaume Chatelet #if defined(LIBC_TYPES_HAS_FLOAT128) 7133f906f51Slntue TEST(LlvmLibcFPBitsTest, Float128Type) { 7143f906f51Slntue using Float128Bits = FPBits<float128>; 7153f906f51Slntue 7166b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(Float128Bits::inf(Sign::POS)).c_str(), 7173f906f51Slntue "(+Infinity)"); 7186b02d2f8SGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(Float128Bits::inf(Sign::NEG)).c_str(), 7193f906f51Slntue "(-Infinity)"); 720ace383dfSGuillaume Chatelet EXPECT_STREQ(LIBC_NAMESPACE::str(Float128Bits::signaling_nan()).c_str(), 721ace383dfSGuillaume Chatelet "(NaN)"); 7223f906f51Slntue 7236b02d2f8SGuillaume Chatelet Float128Bits zero = Float128Bits::zero(Sign::POS); 72411ec512fSGuillaume Chatelet EXPECT_TRUE(zero.is_pos()); 72503232350SGuillaume Chatelet EXPECT_EQ(zero.get_biased_exponent(), 0_u16); 72603232350SGuillaume Chatelet EXPECT_EQ(zero.get_mantissa(), 0_u128); 72703232350SGuillaume Chatelet EXPECT_EQ(zero.uintval(), 0_u128); 7283f906f51Slntue EXPECT_STREQ(LIBC_NAMESPACE::str(zero).c_str(), 7293f906f51Slntue "0x00000000000000000000000000000000 = " 7303f906f51Slntue "(S: 0, E: 0x0000, M: 0x00000000000000000000000000000000)"); 7313f906f51Slntue 7326b02d2f8SGuillaume Chatelet Float128Bits negzero = Float128Bits::zero(Sign::NEG); 73311ec512fSGuillaume Chatelet EXPECT_TRUE(negzero.is_neg()); 73403232350SGuillaume Chatelet EXPECT_EQ(negzero.get_biased_exponent(), 0_u16); 73503232350SGuillaume Chatelet EXPECT_EQ(negzero.get_mantissa(), 0_u128); 736a80a01fcSGuillaume Chatelet EXPECT_EQ(negzero.uintval(), 0x80000000'00000000'00000000'00000000_u128); 7373f906f51Slntue EXPECT_STREQ(LIBC_NAMESPACE::str(negzero).c_str(), 7383f906f51Slntue "0x80000000000000000000000000000000 = " 7393f906f51Slntue "(S: 1, E: 0x0000, M: 0x00000000000000000000000000000000)"); 7403f906f51Slntue 7413f906f51Slntue Float128Bits one(float128(1.0)); 74211ec512fSGuillaume Chatelet EXPECT_TRUE(one.is_pos()); 74303232350SGuillaume Chatelet EXPECT_EQ(one.get_biased_exponent(), 0x3FFF_u16); 74403232350SGuillaume Chatelet EXPECT_EQ(one.get_mantissa(), 0_u128); 745a80a01fcSGuillaume Chatelet EXPECT_EQ(one.uintval(), 0x3FFF0000'00000000'00000000'00000000_u128); 7463f906f51Slntue EXPECT_STREQ(LIBC_NAMESPACE::str(one).c_str(), 7473f906f51Slntue "0x3FFF0000000000000000000000000000 = " 7483f906f51Slntue "(S: 0, E: 0x3FFF, M: 0x00000000000000000000000000000000)"); 7493f906f51Slntue 7503f906f51Slntue Float128Bits negone(float128(-1.0)); 75111ec512fSGuillaume Chatelet EXPECT_TRUE(negone.is_neg()); 75203232350SGuillaume Chatelet EXPECT_EQ(negone.get_biased_exponent(), 0x3FFF_u16); 75303232350SGuillaume Chatelet EXPECT_EQ(negone.get_mantissa(), 0_u128); 754a80a01fcSGuillaume Chatelet EXPECT_EQ(negone.uintval(), 0xBFFF0000'00000000'00000000'00000000_u128); 7553f906f51Slntue EXPECT_STREQ(LIBC_NAMESPACE::str(negone).c_str(), 7563f906f51Slntue "0xBFFF0000000000000000000000000000 = " 7573f906f51Slntue "(S: 1, E: 0x3FFF, M: 0x00000000000000000000000000000000)"); 7583f906f51Slntue 7593f906f51Slntue Float128Bits num(float128(1.125)); 76011ec512fSGuillaume Chatelet EXPECT_TRUE(num.is_pos()); 76103232350SGuillaume Chatelet EXPECT_EQ(num.get_biased_exponent(), 0x3FFF_u16); 762a80a01fcSGuillaume Chatelet EXPECT_EQ(num.get_mantissa(), 0x2000'00000000'00000000'00000000_u128); 763a80a01fcSGuillaume Chatelet EXPECT_EQ(num.uintval(), 0x3FFF2000'00000000'00000000'00000000_u128); 7643f906f51Slntue EXPECT_STREQ(LIBC_NAMESPACE::str(num).c_str(), 7653f906f51Slntue "0x3FFF2000000000000000000000000000 = " 7663f906f51Slntue "(S: 0, E: 0x3FFF, M: 0x00002000000000000000000000000000)"); 7673f906f51Slntue 7683f906f51Slntue Float128Bits negnum(float128(-1.125)); 76911ec512fSGuillaume Chatelet EXPECT_TRUE(negnum.is_neg()); 77003232350SGuillaume Chatelet EXPECT_EQ(negnum.get_biased_exponent(), 0x3FFF_u16); 771a80a01fcSGuillaume Chatelet EXPECT_EQ(negnum.get_mantissa(), 0x2000'00000000'00000000'00000000_u128); 772a80a01fcSGuillaume Chatelet EXPECT_EQ(negnum.uintval(), 0xBFFF2000'00000000'00000000'00000000_u128); 7733f906f51Slntue EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(), 7743f906f51Slntue "0xBFFF2000000000000000000000000000 = " 7753f906f51Slntue "(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)"); 77679a2e2b9SNishant Mittal 777ace383dfSGuillaume Chatelet Float128Bits quiet_nan = Float128Bits::quiet_nan(); 77879a2e2b9SNishant Mittal EXPECT_EQ(quiet_nan.is_quiet_nan(), true); 7793f906f51Slntue } 78075fb825bSGuillaume Chatelet #endif // LIBC_TYPES_HAS_FLOAT128 781