1 //===-- FPEnv.cpp ---- FP Environment -------------------------------------===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// @file
10 /// This file contains the implementations of entities that describe floating
11 /// point environment.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "llvm/IR/FPEnv.h"
16 #include "llvm/ADT/StringSwitch.h"
17 
18 namespace llvm {
19 
StrToRoundingMode(StringRef RoundingArg)20 Optional<RoundingMode> StrToRoundingMode(StringRef RoundingArg) {
21   // For dynamic rounding mode, we use round to nearest but we will set the
22   // 'exact' SDNodeFlag so that the value will not be rounded.
23   return StringSwitch<Optional<RoundingMode>>(RoundingArg)
24       .Case("round.dynamic", RoundingMode::Dynamic)
25       .Case("round.tonearest", RoundingMode::NearestTiesToEven)
26       .Case("round.tonearestaway", RoundingMode::NearestTiesToAway)
27       .Case("round.downward", RoundingMode::TowardNegative)
28       .Case("round.upward", RoundingMode::TowardPositive)
29       .Case("round.towardzero", RoundingMode::TowardZero)
30       .Default(None);
31 }
32 
RoundingModeToStr(RoundingMode UseRounding)33 Optional<StringRef> RoundingModeToStr(RoundingMode UseRounding) {
34   Optional<StringRef> RoundingStr = None;
35   switch (UseRounding) {
36   case RoundingMode::Dynamic:
37     RoundingStr = "round.dynamic";
38     break;
39   case RoundingMode::NearestTiesToEven:
40     RoundingStr = "round.tonearest";
41     break;
42   case RoundingMode::NearestTiesToAway:
43     RoundingStr = "round.tonearestaway";
44     break;
45   case RoundingMode::TowardNegative:
46     RoundingStr = "round.downward";
47     break;
48   case RoundingMode::TowardPositive:
49     RoundingStr = "round.upward";
50     break;
51   case RoundingMode::TowardZero:
52     RoundingStr = "round.towardzero";
53     break;
54   default:
55     break;
56   }
57   return RoundingStr;
58 }
59 
StrToExceptionBehavior(StringRef ExceptionArg)60 Optional<fp::ExceptionBehavior> StrToExceptionBehavior(StringRef ExceptionArg) {
61   return StringSwitch<Optional<fp::ExceptionBehavior>>(ExceptionArg)
62       .Case("fpexcept.ignore", fp::ebIgnore)
63       .Case("fpexcept.maytrap", fp::ebMayTrap)
64       .Case("fpexcept.strict", fp::ebStrict)
65       .Default(None);
66 }
67 
ExceptionBehaviorToStr(fp::ExceptionBehavior UseExcept)68 Optional<StringRef> ExceptionBehaviorToStr(fp::ExceptionBehavior UseExcept) {
69   Optional<StringRef> ExceptStr = None;
70   switch (UseExcept) {
71   case fp::ebStrict:
72     ExceptStr = "fpexcept.strict";
73     break;
74   case fp::ebIgnore:
75     ExceptStr = "fpexcept.ignore";
76     break;
77   case fp::ebMayTrap:
78     ExceptStr = "fpexcept.maytrap";
79     break;
80   }
81   return ExceptStr;
82 }
83 } // namespace llvm
84