1447d59e0SSiva Chandra Reddy //===-- RoundingModeUtils.cpp ---------------------------------------------===// 2447d59e0SSiva Chandra Reddy // 3447d59e0SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4447d59e0SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5447d59e0SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6447d59e0SSiva Chandra Reddy // 7447d59e0SSiva Chandra Reddy //===----------------------------------------------------------------------===// 8447d59e0SSiva Chandra Reddy 9447d59e0SSiva Chandra Reddy #include "RoundingModeUtils.h" 10055be3c3STue Ly #include "src/__support/FPUtil/FEnvImpl.h" 11055be3c3STue Ly #include "src/__support/FPUtil/rounding_mode.h" 12447d59e0SSiva Chandra Reddy 1349561181SJob Henandez Lara #include "hdr/fenv_macros.h" 14*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 15447d59e0SSiva Chandra Reddy 16*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 17447d59e0SSiva Chandra Reddy namespace fputil { 18447d59e0SSiva Chandra Reddy namespace testing { 19447d59e0SSiva Chandra Reddy 20447d59e0SSiva Chandra Reddy int get_fe_rounding(RoundingMode mode) { 21447d59e0SSiva Chandra Reddy switch (mode) { 22447d59e0SSiva Chandra Reddy case RoundingMode::Upward: 23447d59e0SSiva Chandra Reddy return FE_UPWARD; 24447d59e0SSiva Chandra Reddy case RoundingMode::Downward: 25447d59e0SSiva Chandra Reddy return FE_DOWNWARD; 26447d59e0SSiva Chandra Reddy case RoundingMode::TowardZero: 27447d59e0SSiva Chandra Reddy return FE_TOWARDZERO; 28447d59e0SSiva Chandra Reddy case RoundingMode::Nearest: 29447d59e0SSiva Chandra Reddy return FE_TONEAREST; 30447d59e0SSiva Chandra Reddy } 31485e2de6SJoseph Huber __builtin_unreachable(); 32447d59e0SSiva Chandra Reddy } 33447d59e0SSiva Chandra Reddy 34447d59e0SSiva Chandra Reddy ForceRoundingMode::ForceRoundingMode(RoundingMode mode) { 35055be3c3STue Ly old_rounding_mode = quick_get_round(); 36447d59e0SSiva Chandra Reddy rounding_mode = get_fe_rounding(mode); 37055be3c3STue Ly if (old_rounding_mode != rounding_mode) { 38055be3c3STue Ly int status = set_round(rounding_mode); 39055be3c3STue Ly success = (status == 0); 40055be3c3STue Ly } else { 41055be3c3STue Ly success = true; 42055be3c3STue Ly } 43447d59e0SSiva Chandra Reddy } 44447d59e0SSiva Chandra Reddy 45447d59e0SSiva Chandra Reddy ForceRoundingMode::~ForceRoundingMode() { 46447d59e0SSiva Chandra Reddy if (old_rounding_mode != rounding_mode) 47055be3c3STue Ly set_round(old_rounding_mode); 48447d59e0SSiva Chandra Reddy } 49447d59e0SSiva Chandra Reddy 50447d59e0SSiva Chandra Reddy } // namespace testing 51447d59e0SSiva Chandra Reddy } // namespace fputil 52*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 53