53 lines · cpp
1//===-- RoundingModeUtils.cpp ---------------------------------------------===//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 "RoundingModeUtils.h"10#include "src/__support/FPUtil/FEnvImpl.h"11#include "src/__support/FPUtil/rounding_mode.h"12 13#include "hdr/fenv_macros.h"14#include "src/__support/macros/config.h"15 16namespace LIBC_NAMESPACE_DECL {17namespace fputil {18namespace testing {19 20int get_fe_rounding(RoundingMode mode) {21 switch (mode) {22 case RoundingMode::Upward:23 return FE_UPWARD;24 case RoundingMode::Downward:25 return FE_DOWNWARD;26 case RoundingMode::TowardZero:27 return FE_TOWARDZERO;28 case RoundingMode::Nearest:29 return FE_TONEAREST;30 }31 __builtin_unreachable();32}33 34ForceRoundingMode::ForceRoundingMode(RoundingMode mode) {35 old_rounding_mode = quick_get_round();36 rounding_mode = get_fe_rounding(mode);37 if (old_rounding_mode != rounding_mode) {38 int status = set_round(rounding_mode);39 success = (status == 0);40 } else {41 success = true;42 }43}44 45ForceRoundingMode::~ForceRoundingMode() {46 if (old_rounding_mode != rounding_mode)47 set_round(old_rounding_mode);48}49 50} // namespace testing51} // namespace fputil52} // namespace LIBC_NAMESPACE_DECL53