| //===-- Unittests for the quick rounding mode checks ----------------------===// | |
| // | |
| // 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 "src/__support/FPUtil/rounding_mode.h" | |
| #include "test/UnitTest/Test.h" | |
| #include "utils/MPFRWrapper/MPFRUtils.h" | |
| #include "hdr/fenv_macros.h" | |
| using LIBC_NAMESPACE::testing::mpfr::ForceRoundingMode; | |
| using LIBC_NAMESPACE::testing::mpfr::RoundingMode; | |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingUpTest) { | |
| using LIBC_NAMESPACE::fputil::fenv_is_round_up; | |
| { | |
| ForceRoundingMode __r(RoundingMode::Upward); | |
| if (__r.success) { | |
| ASSERT_TRUE(fenv_is_round_up()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Downward); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_up()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Nearest); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_up()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::TowardZero); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_up()); | |
| } | |
| } | |
| } | |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingDownTest) { | |
| using LIBC_NAMESPACE::fputil::fenv_is_round_down; | |
| { | |
| ForceRoundingMode __r(RoundingMode::Upward); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_down()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Downward); | |
| if (__r.success) { | |
| ASSERT_TRUE(fenv_is_round_down()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Nearest); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_down()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::TowardZero); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_down()); | |
| } | |
| } | |
| } | |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingNearestTest) { | |
| using LIBC_NAMESPACE::fputil::fenv_is_round_to_nearest; | |
| { | |
| ForceRoundingMode __r(RoundingMode::Upward); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_to_nearest()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Downward); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_to_nearest()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Nearest); | |
| if (__r.success) { | |
| ASSERT_TRUE(fenv_is_round_to_nearest()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::TowardZero); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_to_nearest()); | |
| } | |
| } | |
| } | |
| TEST(LlvmLibcFEnvImplTest, QuickRoundingTowardZeroTest) { | |
| using LIBC_NAMESPACE::fputil::fenv_is_round_to_zero; | |
| { | |
| ForceRoundingMode __r(RoundingMode::Upward); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_to_zero()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Downward); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_to_zero()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Nearest); | |
| if (__r.success) { | |
| ASSERT_FALSE(fenv_is_round_to_zero()); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::TowardZero); | |
| if (__r.success) { | |
| ASSERT_TRUE(fenv_is_round_to_zero()); | |
| } | |
| } | |
| } | |
| TEST(LlvmLibcFEnvImplTest, QuickGetRoundTest) { | |
| using LIBC_NAMESPACE::fputil::quick_get_round; | |
| { | |
| ForceRoundingMode __r(RoundingMode::Upward); | |
| if (__r.success) { | |
| ASSERT_EQ(quick_get_round(), FE_UPWARD); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Downward); | |
| if (__r.success) { | |
| ASSERT_EQ(quick_get_round(), FE_DOWNWARD); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::Nearest); | |
| if (__r.success) { | |
| ASSERT_EQ(quick_get_round(), FE_TONEAREST); | |
| } | |
| } | |
| { | |
| ForceRoundingMode __r(RoundingMode::TowardZero); | |
| if (__r.success) { | |
| ASSERT_EQ(quick_get_round(), FE_TOWARDZERO); | |
| } | |
| } | |
| } |