//===- llvm/unittest/ADT/FloatingPointMode.cpp ----------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/FloatingPointMode.h" #include "gtest/gtest.h" using namespace llvm; namespace { static constexpr FPClassTest OrderedLessThanZeroMask = fcNegSubnormal | fcNegNormal | fcNegInf; static constexpr FPClassTest OrderedGreaterThanZeroMask = fcPosSubnormal | fcPosNormal | fcPosInf; TEST(FloatingPointModeTest, ParseDenormalFPAttributeComponent) { EXPECT_EQ(DenormalMode::IEEE, parseDenormalFPAttributeComponent("ieee")); EXPECT_EQ(DenormalMode::IEEE, parseDenormalFPAttributeComponent("")); EXPECT_EQ(DenormalMode::PreserveSign, parseDenormalFPAttributeComponent("preserve-sign")); EXPECT_EQ(DenormalMode::PositiveZero, parseDenormalFPAttributeComponent("positive-zero")); EXPECT_EQ(DenormalMode::PreserveSign, parseDenormalFPAttributeComponent("preservesign")); EXPECT_EQ(DenormalMode::PositiveZero, parseDenormalFPAttributeComponent("positivezero")); EXPECT_EQ(DenormalMode::Dynamic, parseDenormalFPAttributeComponent("dynamic")); EXPECT_EQ(DenormalMode::Invalid, parseDenormalFPAttributeComponent("foo")); } TEST(FloatingPointModeTest, DenormalAttributeName) { EXPECT_EQ("ieee", denormalModeKindName(DenormalMode::IEEE)); EXPECT_EQ("preserve-sign", denormalModeKindName(DenormalMode::PreserveSign)); EXPECT_EQ("positive-zero", denormalModeKindName(DenormalMode::PositiveZero)); EXPECT_EQ("dynamic", denormalModeKindName(DenormalMode::Dynamic)); EXPECT_EQ("", denormalModeKindName(DenormalMode::Invalid)); } TEST(FloatingPointModeTest, ParseDenormalFPAttribute) { EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE), parseDenormalFPAttribute("ieee")); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE), parseDenormalFPAttribute("ieee,ieee")); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE), parseDenormalFPAttribute("ieee,")); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE), parseDenormalFPAttribute("")); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE), parseDenormalFPAttribute(",")); EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign), parseDenormalFPAttribute("preserve-sign")); EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign), parseDenormalFPAttribute("preserve-sign,")); EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign), parseDenormalFPAttribute("preserve-sign,preserve-sign")); EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero), parseDenormalFPAttribute("positive-zero")); EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero), parseDenormalFPAttribute("positive-zero,positive-zero")); EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic), parseDenormalFPAttribute("dynamic")); EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic), parseDenormalFPAttribute("dynamic,dynamic")); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PositiveZero), parseDenormalFPAttribute("ieee,positive-zero")); EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::IEEE), parseDenormalFPAttribute("positive-zero,ieee")); EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE), parseDenormalFPAttribute("preserve-sign,ieee")); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign), parseDenormalFPAttribute("ieee,preserve-sign")); EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::PreserveSign), parseDenormalFPAttribute("dynamic,preserve-sign")); EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::Dynamic), parseDenormalFPAttribute("preserve-sign,dynamic")); EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid), parseDenormalFPAttribute("foo")); EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid), parseDenormalFPAttribute("foo,foo")); EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid), parseDenormalFPAttribute("foo,bar")); } TEST(FloatingPointModeTest, RenderDenormalFPAttribute) { EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid), parseDenormalFPAttribute("foo")); EXPECT_EQ("ieee,ieee", DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).str()); EXPECT_EQ(",", DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid).str()); EXPECT_EQ( "preserve-sign,preserve-sign", DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign).str()); EXPECT_EQ("preserve-sign,preserve-sign", DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign) .str()); EXPECT_EQ( "positive-zero,positive-zero", DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero).str()); EXPECT_EQ("positive-zero,positive-zero", DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero) .str()); EXPECT_EQ( "ieee,preserve-sign", DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign).str()); EXPECT_EQ( "preserve-sign,ieee", DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE).str()); EXPECT_EQ( "preserve-sign,positive-zero", DenormalMode(DenormalMode::PreserveSign, DenormalMode::PositiveZero).str()); EXPECT_EQ("dynamic,dynamic", DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic).str()); EXPECT_EQ("ieee,dynamic", DenormalMode(DenormalMode::IEEE, DenormalMode::Dynamic).str()); EXPECT_EQ("dynamic,ieee", DenormalMode(DenormalMode::Dynamic, DenormalMode::IEEE).str()); } TEST(FloatingPointModeTest, DenormalModeIsSimple) { EXPECT_TRUE(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).isSimple()); EXPECT_FALSE(DenormalMode(DenormalMode::IEEE, DenormalMode::Invalid).isSimple()); EXPECT_FALSE(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PositiveZero).isSimple()); EXPECT_FALSE(DenormalMode(DenormalMode::PreserveSign, DenormalMode::Dynamic) .isSimple()); EXPECT_FALSE(DenormalMode(DenormalMode::Dynamic, DenormalMode::PreserveSign) .isSimple()); } TEST(FloatingPointModeTest, DenormalModeIsValid) { EXPECT_TRUE(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).isValid()); EXPECT_FALSE(DenormalMode(DenormalMode::IEEE, DenormalMode::Invalid).isValid()); EXPECT_FALSE(DenormalMode(DenormalMode::Invalid, DenormalMode::IEEE).isValid()); EXPECT_FALSE(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid).isValid()); } TEST(FloatingPointModeTest, DenormalModeConstructor) { EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid), DenormalMode::getInvalid()); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE), DenormalMode::getIEEE()); EXPECT_EQ(DenormalMode::getIEEE(), DenormalMode::getDefault()); EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic), DenormalMode::getDynamic()); EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign), DenormalMode::getPreserveSign()); EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero), DenormalMode::getPositiveZero()); } TEST(FloatingPointModeTest, DenormalModeMerge) { EXPECT_EQ( DenormalMode::getInvalid(), DenormalMode::getInvalid().mergeCalleeMode(DenormalMode::getInvalid())); EXPECT_EQ(DenormalMode::getIEEE(), DenormalMode::getInvalid().mergeCalleeMode( DenormalMode::getIEEE())); EXPECT_EQ(DenormalMode::getInvalid(), DenormalMode::getIEEE().mergeCalleeMode( DenormalMode::getInvalid())); EXPECT_EQ(DenormalMode::getIEEE(), DenormalMode::getIEEE().mergeCalleeMode( DenormalMode::getDynamic())); EXPECT_EQ(DenormalMode::getPreserveSign(), DenormalMode::getPreserveSign().mergeCalleeMode( DenormalMode::getDynamic())); EXPECT_EQ(DenormalMode::getPositiveZero(), DenormalMode::getPositiveZero().mergeCalleeMode( DenormalMode::getDynamic())); EXPECT_EQ( DenormalMode::getDynamic(), DenormalMode::getDynamic().mergeCalleeMode(DenormalMode::getDynamic())); EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign), DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign) .mergeCalleeMode( DenormalMode(DenormalMode::IEEE, DenormalMode::Dynamic))); EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE), DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE) .mergeCalleeMode( DenormalMode(DenormalMode::Dynamic, DenormalMode::IEEE))); EXPECT_EQ( DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign), DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign) .mergeCalleeMode( DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic))); EXPECT_EQ( DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign), DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign) .mergeCalleeMode( DenormalMode(DenormalMode::PositiveZero, DenormalMode::Dynamic))); EXPECT_EQ( DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign), DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign) .mergeCalleeMode( DenormalMode(DenormalMode::Dynamic, DenormalMode::PreserveSign))); // Test some invalid / undefined behavior cases EXPECT_EQ( DenormalMode::getPreserveSign(), DenormalMode::getIEEE().mergeCalleeMode(DenormalMode::getPreserveSign())); EXPECT_EQ( DenormalMode::getPreserveSign(), DenormalMode::getIEEE().mergeCalleeMode(DenormalMode::getPreserveSign())); EXPECT_EQ( DenormalMode::getIEEE(), DenormalMode::getPreserveSign().mergeCalleeMode(DenormalMode::getIEEE())); EXPECT_EQ( DenormalMode::getIEEE(), DenormalMode::getPreserveSign().mergeCalleeMode(DenormalMode::getIEEE())); } TEST(FloatingPointModeTest, DenormalModePredicates) { EXPECT_TRUE(DenormalMode::getPreserveSign().inputsAreZero()); EXPECT_TRUE(DenormalMode::getPositiveZero().inputsAreZero()); EXPECT_FALSE(DenormalMode::getIEEE().inputsAreZero()); EXPECT_FALSE(DenormalMode::getDynamic().inputsAreZero()); } #define TEST_ORDERED_LT(a, b) \ EXPECT_TRUE(cannotOrderStrictlyGreater(a, b)); \ EXPECT_FALSE(cannotOrderStrictlyGreater(b, a)); TEST(FloatingPointModeTest, cannotOrderStrictlyGreater) { EXPECT_TRUE(cannotOrderStrictlyGreater(fcNone, fcNone)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcAllFlags, fcAllFlags)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcQNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcSNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcSNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcQNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcQNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcSNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcSNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcQNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcPosZero, true)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcPosZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosZero, fcNegZero, true)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcPosZero, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcPosZero, fcPosZero, true)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcNegZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcNegZero, true)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegSubnormal, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcNegZero, fcNegSubnormal)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcPosSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosSubnormal, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcNegZero, fcSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcSubnormal, fcNegZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcPosZero, fcPosSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosSubnormal, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosZero, fcNegSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosZero, fcNegSubnormal, true)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcZero, fcSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcZero, fcSubnormal, true)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcZero, fcNegSubnormal)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcZero, fcPosSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosSubnormal, fcZero)); TEST_ORDERED_LT(fcNegInf, fcNegNormal); TEST_ORDERED_LT(fcNegInf, fcNegSubnormal); TEST_ORDERED_LT(fcNegInf, fcNegZero); TEST_ORDERED_LT(fcNegInf, fcPosZero); TEST_ORDERED_LT(fcNegInf, fcPosSubnormal); TEST_ORDERED_LT(fcNegInf, fcPosNormal); TEST_ORDERED_LT(fcNegInf, fcPosInf); TEST_ORDERED_LT(fcNegNormal, fcPosNormal); TEST_ORDERED_LT(fcNegNormal, fcPositive); TEST_ORDERED_LT(fcNegNormal, fcPositive | fcNan); TEST_ORDERED_LT(fcNegNormal | fcNan, fcPositive | fcNan); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegNormal, fcPosNormal | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosNormal | fcNan, fcNegNormal)); EXPECT_FALSE( cannotOrderStrictlyGreater(fcPosNormal | fcNan, fcNegNormal | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcNegNormal | fcNan, fcNegNormal)); EXPECT_FALSE( cannotOrderStrictlyGreater(fcNegNormal | fcNan, fcNegNormal | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, ~fcNegInf)); EXPECT_FALSE(cannotOrderStrictlyGreater(~fcNegInf, fcNegInf)); TEST_ORDERED_LT(fcNegInf, ~(fcNegInf | fcNan)); TEST_ORDERED_LT(fcNegative, fcPositive); TEST_ORDERED_LT(fcNegFinite, fcPosFinite); TEST_ORDERED_LT(fcNegZero, fcPosInf); TEST_ORDERED_LT(fcPosZero, fcPosInf); TEST_ORDERED_LT(fcZero, fcPosInf); EXPECT_FALSE(cannotOrderStrictlyGreater(fcNegZero, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcZero, fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcInf, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcZero, fcInf | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcInf | fcNan, fcZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf | fcNan, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosInf | fcNan, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcZero | fcNan, fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcInf, fcZero | fcNan)); TEST_ORDERED_LT(OrderedLessThanZeroMask, OrderedGreaterThanZeroMask); TEST_ORDERED_LT(OrderedLessThanZeroMask, OrderedGreaterThanZeroMask | fcNan); TEST_ORDERED_LT(OrderedLessThanZeroMask | fcNegZero, OrderedGreaterThanZeroMask); TEST_ORDERED_LT(OrderedLessThanZeroMask | fcPosZero, OrderedGreaterThanZeroMask); TEST_ORDERED_LT(OrderedLessThanZeroMask | fcZero, OrderedGreaterThanZeroMask); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcPosZero, true)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcPosZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosZero, fcNegZero, true)); TEST_ORDERED_LT(fcNegZero, fcPosSubnormal); TEST_ORDERED_LT(fcNegZero, fcPosZero | fcPosSubnormal); TEST_ORDERED_LT(fcNegZero, OrderedGreaterThanZeroMask); EXPECT_FALSE(cannotOrderStrictlyGreater(OrderedLessThanZeroMask, OrderedLessThanZeroMask | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreater(OrderedLessThanZeroMask | fcNan, OrderedLessThanZeroMask | fcNan)); TEST_ORDERED_LT(fcZero, fcPosInf); TEST_ORDERED_LT(fcZero, fcPosInf | fcNan); EXPECT_TRUE(cannotOrderStrictlyGreater(fcZero | fcNan, fcPosInf)); TEST_ORDERED_LT(fcPosNormal, fcPosInf); TEST_ORDERED_LT(fcPosNormal, fcPosInf | fcNan); TEST_ORDERED_LT(fcNegInf, fcPosInf); TEST_ORDERED_LT(fcNegInf | fcNegZero, fcPosInf); EXPECT_TRUE( cannotOrderStrictlyGreater(fcNegInf | fcNegZero, fcZero | fcPosInf)); EXPECT_FALSE( cannotOrderStrictlyGreater(fcZero | fcPosInf, fcNegInf | fcNegZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf | fcNegZero, fcZero | fcPosInf, true)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcZero | fcPosInf, fcNegInf | fcNegZero, true)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf | fcNegZero, fcZero | fcPosInf | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf | fcNegZero, fcPosZero | fcPosInf | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcPosInf, fcPosInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcPosZero, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcNegSubnormal, fcNegSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosSubnormal, fcPosSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcNegNormal, fcNegNormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosNormal, fcPosNormal)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcFinite, fcFinite)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcFinite, fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcInf, fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreater(fcPosInf, ~fcPosInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(~fcPosInf, fcPosInf)); EXPECT_TRUE(cannotOrderStrictlyGreater(fcNegInf, ~fcNegInf)); EXPECT_FALSE(cannotOrderStrictlyGreater(~fcNegInf, fcNegInf)); } TEST(FloatingPointModeTest, cannotOrderStrictlyGreaterEq) { EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNone, fcNone)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcAllFlags, fcAllFlags)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcQNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcSNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcSNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcQNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcQNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcSNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegInf, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegInf, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegInf, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcSNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcQNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNan, fcNegInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegInf, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegZero, fcPosZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosZero, fcNegZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosZero, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosZero, fcPosZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero, fcNegZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(OrderedLessThanZeroMask, OrderedLessThanZeroMask)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(OrderedLessThanZeroMask, OrderedLessThanZeroMask | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(OrderedLessThanZeroMask, OrderedGreaterThanZeroMask)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(OrderedLessThanZeroMask, OrderedGreaterThanZeroMask | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(OrderedLessThanZeroMask | fcNan, OrderedGreaterThanZeroMask)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero, fcNegZero | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero | fcNan, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegZero, fcPosZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero | fcNan, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegZero | fcNan, fcPosZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosZero | fcNan, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero, fcPosZero | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegZero, fcPosZero | fcNan, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosZero, fcNegZero | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegZero, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero, fcNegZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero, fcPosZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosInf, fcPosInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosInf, fcPosInf | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosInf | fcNan, fcPosInf)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPosInf | fcNan, fcPosInf | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegSubnormal, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegSubnormal, fcNegZero)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcNegSubnormal | fcNegZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosSubnormal, fcZero)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegSubnormal, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcSubnormal, fcZero)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcZero, fcPosInf)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcZero, fcPosInf | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcZero | fcNan, fcPosInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosNormal, fcPosNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosSubnormal, fcPosSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegNormal, fcNegNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegSubnormal, fcNegSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosNormal | fcPosSubnormal, fcPosNormal | fcPosSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegNormal | fcNegSubnormal, fcNegNormal | fcNegSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNormal, fcNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcSubnormal, fcSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcSubnormal | fcNormal, fcSubnormal | fcNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegInf, fcNegInf | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegInf | fcNan, fcNegInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegSubnormal, fcNegNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosSubnormal, fcNegNormal)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcPosSubnormal, fcPosNormal)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegSubnormal, fcPosNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegSubnormal, fcNegInf)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcNegInf | fcNegZero, fcZero | fcPosInf)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcZero | fcPosInf, fcNegInf | fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegInf | fcNegZero, fcZero | fcPosInf | fcNan)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegInf | fcNegZero, fcPosZero | fcPosInf | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegInf | fcNegZero, fcPosZero | fcPosInf | fcNan, /*OrderedZeroSign=*/true)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPosInf | fcPosNormal, fcPosNormal)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPosNormal, fcPosInf | fcPosNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq( fcPosInf | fcPosNormal | fcSubnormal, fcPosNormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq( fcPosNormal, fcPosInf | fcPosNormal | fcSubnormal)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPosSubnormal | fcPosZero, fcPosZero)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPosZero, fcPosSubnormal | fcPosZero)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcSubnormal | fcPosZero, fcPosZero)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPosZero, fcSubnormal | fcPosZero)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcSubnormal | fcPosZero, fcNegZero)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcNegZero, fcSubnormal | fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegative, fcPositive)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegative, fcPositive, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPositive, fcNegative)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcNegative | fcNan, fcPositive | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq( fcNegative | fcNan, fcPositive | fcNan, /*OrderedZeroSign=*/true)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPositive | fcNan, fcNegative | fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcZero, fcNan)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNan, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero, fcSubnormal)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcSubnormal, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcFinite, fcFinite)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcFinite, fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcInf, fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcNegFinite, fcPosFinite)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegFinite, fcPosFinite, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosFinite, fcNegFinite)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcNegFinite, fcPosFinite | fcNegZero)); EXPECT_FALSE( cannotOrderStrictlyGreaterEq(fcPosFinite | fcNegZero, fcNegFinite)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero | fcInf, fcZero | fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero, fcZero | fcInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero | fcInf, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcZero | fcInf | fcNormal, fcZero)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(fcPosInf, ~fcPosInf)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(~fcPosInf, fcPosInf)); EXPECT_TRUE(cannotOrderStrictlyGreaterEq(fcNegInf, ~fcNegInf)); EXPECT_FALSE(cannotOrderStrictlyGreaterEq(~fcNegInf, fcNegInf)); } TEST(FloatingPointModeTest, cannotOrderStrictlyLess) { EXPECT_TRUE(cannotOrderStrictlyLess(fcNone, fcNone)); EXPECT_FALSE(cannotOrderStrictlyLess(fcAllFlags, fcAllFlags)); EXPECT_FALSE(cannotOrderStrictlyLess(OrderedLessThanZeroMask, OrderedLessThanZeroMask)); EXPECT_FALSE(cannotOrderStrictlyLess(OrderedLessThanZeroMask, OrderedGreaterThanZeroMask)); EXPECT_TRUE(cannotOrderStrictlyLess(OrderedGreaterThanZeroMask, OrderedLessThanZeroMask)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPositive, fcNegative)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPositive, fcNegative, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyLess(fcNegative, fcPositive)); EXPECT_FALSE(cannotOrderStrictlyLess(fcNegative, fcPositive, /*OrderedZeroSign=*/true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPositive | fcNan, fcNegative)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPositive | fcNan, fcNegative, /*OrderedZeroSign=*/true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPositive, fcNegative | fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPositive, fcNegative | fcNan, /*OrderedZeroSign=*/true)); EXPECT_TRUE(cannotOrderStrictlyLess(OrderedGreaterThanZeroMask | fcNan, OrderedLessThanZeroMask)); EXPECT_TRUE(cannotOrderStrictlyLess(OrderedGreaterThanZeroMask, OrderedLessThanZeroMask | fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(OrderedGreaterThanZeroMask | fcNan, OrderedLessThanZeroMask | fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcQNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcSNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcSNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcQNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcQNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcSNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNegInf, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNegInf, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNegInf, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcSNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLess(fcQNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNegInf, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNegZero, fcPosZero)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPosZero, fcNegZero)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPosZero, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcPosZero, fcPosZero)); EXPECT_TRUE( cannotOrderStrictlyLess(fcPosZero, fcNegZero, /*OrderedZeroSign=*/true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcZero, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyLess(fcZero, fcPosZero, true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPosZero, fcZero)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPosZero, fcZero, true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcZero, fcNegZero)); EXPECT_TRUE(cannotOrderStrictlyLess(fcZero, fcNegZero, true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNegZero, fcZero)); EXPECT_FALSE(cannotOrderStrictlyLess(fcNegZero, fcZero, true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcZero, fcZero)); EXPECT_FALSE(cannotOrderStrictlyLess(fcZero, fcZero, true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcInf, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLess(fcNan, fcInf)); EXPECT_TRUE( cannotOrderStrictlyLess(fcPosInf | fcPosZero, fcNegZero | fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLess( fcPosInf | fcPosZero, fcNegZero | fcNegInf, /*OrderedZeroSign=*/true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPosInf | fcPosZero, fcZero | fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPosInf | fcPosZero, fcZero | fcNegInf, /*OrderedZeroSign=*/true)); EXPECT_FALSE( cannotOrderStrictlyLess(fcZero | fcNegInf, fcPosInf | fcPosZero)); EXPECT_FALSE( cannotOrderStrictlyLess(fcNegInf | fcNegZero, fcZero | fcPosInf)); EXPECT_FALSE( cannotOrderStrictlyLess(fcNegInf | fcNegZero, fcZero | fcPosInf, true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcZero | fcPosInf, fcNegInf | fcNegZero)); EXPECT_TRUE( cannotOrderStrictlyLess(fcZero | fcPosInf, fcNegInf | fcNegZero, true)); EXPECT_TRUE(cannotOrderStrictlyLess(fcPosInf, ~fcPosInf)); EXPECT_FALSE(cannotOrderStrictlyLess(~fcPosInf, fcPosInf)); EXPECT_FALSE(cannotOrderStrictlyLess(fcNegInf, ~fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLess(~fcNegInf, fcNegInf)); } TEST(FloatingPointModeTest, cannotOrderStrictlyLessEq) { EXPECT_TRUE(cannotOrderStrictlyLessEq(fcNone, fcNone)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcAllFlags, fcAllFlags)); EXPECT_FALSE(cannotOrderStrictlyLessEq(OrderedLessThanZeroMask, OrderedLessThanZeroMask)); EXPECT_FALSE(cannotOrderStrictlyLessEq(OrderedLessThanZeroMask, OrderedGreaterThanZeroMask)); EXPECT_TRUE(cannotOrderStrictlyLessEq(OrderedGreaterThanZeroMask, OrderedLessThanZeroMask)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcPositive, fcNegative)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcPositive, fcNegative, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcNegative, fcPositive)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcNegative, fcPositive, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcPositive | fcNan, fcNegative)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcPositive | fcNan, fcNegative, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcPositive, fcNegative | fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcPositive, fcNegative | fcNan, /*OrderedZeroSign=*/true)); EXPECT_TRUE(cannotOrderStrictlyLessEq(OrderedGreaterThanZeroMask | fcNan, OrderedLessThanZeroMask)); EXPECT_TRUE(cannotOrderStrictlyLessEq(OrderedGreaterThanZeroMask, OrderedLessThanZeroMask | fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(OrderedGreaterThanZeroMask | fcNan, OrderedLessThanZeroMask | fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcQNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcSNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcSNan, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcQNan, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcQNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcSNan, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcNegInf, fcSNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcNegInf, fcQNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcNegInf, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcSNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcQNan, fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcNan, fcNegInf)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcNegInf, fcNegInf)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcNegZero, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcPosZero, fcNegZero)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcPosZero, fcNegZero, /*OrderedZeroSign=*/true)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcZero, fcPosZero)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcPosZero, fcZero)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcZero, fcNegZero)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcNegZero, fcZero)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcZero, fcZero)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcInf, fcNan)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcNan, fcInf)); EXPECT_FALSE( cannotOrderStrictlyLessEq(fcPosInf | fcPosZero, fcNegZero | fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLessEq( fcPosInf | fcPosZero, fcNegZero | fcNegInf, /*OrderedZeroSign=*/true)); EXPECT_FALSE( cannotOrderStrictlyLessEq(fcPosInf | fcPosZero, fcZero | fcNegInf)); EXPECT_FALSE( cannotOrderStrictlyLessEq(fcZero | fcNegInf, fcPosInf | fcPosZero)); EXPECT_FALSE( cannotOrderStrictlyLessEq(fcNegInf | fcNegZero, fcZero | fcPosInf)); EXPECT_FALSE( cannotOrderStrictlyLessEq(fcZero | fcPosInf, fcNegInf | fcNegZero)); EXPECT_TRUE(cannotOrderStrictlyLessEq(fcPosInf, ~fcPosInf)); EXPECT_FALSE(cannotOrderStrictlyLessEq(~fcPosInf, fcPosInf)); EXPECT_FALSE(cannotOrderStrictlyLessEq(fcNegInf, ~fcNegInf)); EXPECT_TRUE(cannotOrderStrictlyLessEq(~fcNegInf, fcNegInf)); } }