xref: /llvm-project/libc/test/UnitTest/RoundingModeUtils.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
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