1*71db0c75SAndroid Build Coastguard Worker //===-- RoundingModeUtils.cpp ---------------------------------------------===// 2*71db0c75SAndroid Build Coastguard Worker // 3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*71db0c75SAndroid Build Coastguard Worker // 7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*71db0c75SAndroid Build Coastguard Worker 9*71db0c75SAndroid Build Coastguard Worker #include "RoundingModeUtils.h" 10*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FEnvImpl.h" 11*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/rounding_mode.h" 12*71db0c75SAndroid Build Coastguard Worker 13*71db0c75SAndroid Build Coastguard Worker #include "hdr/fenv_macros.h" 14*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h" 15*71db0c75SAndroid Build Coastguard Worker 16*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL { 17*71db0c75SAndroid Build Coastguard Worker namespace fputil { 18*71db0c75SAndroid Build Coastguard Worker namespace testing { 19*71db0c75SAndroid Build Coastguard Worker get_fe_rounding(RoundingMode mode)20*71db0c75SAndroid Build Coastguard Workerint get_fe_rounding(RoundingMode mode) { 21*71db0c75SAndroid Build Coastguard Worker switch (mode) { 22*71db0c75SAndroid Build Coastguard Worker case RoundingMode::Upward: 23*71db0c75SAndroid Build Coastguard Worker return FE_UPWARD; 24*71db0c75SAndroid Build Coastguard Worker case RoundingMode::Downward: 25*71db0c75SAndroid Build Coastguard Worker return FE_DOWNWARD; 26*71db0c75SAndroid Build Coastguard Worker case RoundingMode::TowardZero: 27*71db0c75SAndroid Build Coastguard Worker return FE_TOWARDZERO; 28*71db0c75SAndroid Build Coastguard Worker case RoundingMode::Nearest: 29*71db0c75SAndroid Build Coastguard Worker return FE_TONEAREST; 30*71db0c75SAndroid Build Coastguard Worker } 31*71db0c75SAndroid Build Coastguard Worker __builtin_unreachable(); 32*71db0c75SAndroid Build Coastguard Worker } 33*71db0c75SAndroid Build Coastguard Worker ForceRoundingMode(RoundingMode mode)34*71db0c75SAndroid Build Coastguard WorkerForceRoundingMode::ForceRoundingMode(RoundingMode mode) { 35*71db0c75SAndroid Build Coastguard Worker old_rounding_mode = quick_get_round(); 36*71db0c75SAndroid Build Coastguard Worker rounding_mode = get_fe_rounding(mode); 37*71db0c75SAndroid Build Coastguard Worker if (old_rounding_mode != rounding_mode) { 38*71db0c75SAndroid Build Coastguard Worker int status = set_round(rounding_mode); 39*71db0c75SAndroid Build Coastguard Worker success = (status == 0); 40*71db0c75SAndroid Build Coastguard Worker } else { 41*71db0c75SAndroid Build Coastguard Worker success = true; 42*71db0c75SAndroid Build Coastguard Worker } 43*71db0c75SAndroid Build Coastguard Worker } 44*71db0c75SAndroid Build Coastguard Worker ~ForceRoundingMode()45*71db0c75SAndroid Build Coastguard WorkerForceRoundingMode::~ForceRoundingMode() { 46*71db0c75SAndroid Build Coastguard Worker if (old_rounding_mode != rounding_mode) 47*71db0c75SAndroid Build Coastguard Worker set_round(old_rounding_mode); 48*71db0c75SAndroid Build Coastguard Worker } 49*71db0c75SAndroid Build Coastguard Worker 50*71db0c75SAndroid Build Coastguard Worker } // namespace testing 51*71db0c75SAndroid Build Coastguard Worker } // namespace fputil 52*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL 53