xref: /freebsd-src/contrib/llvm-project/llvm/lib/IR/FPEnv.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1480093f4SDimitry Andric //===-- FPEnv.cpp ---- FP Environment -------------------------------------===//
2480093f4SDimitry Andric //
3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6480093f4SDimitry Andric //
7480093f4SDimitry Andric //===----------------------------------------------------------------------===//
8480093f4SDimitry Andric //
9480093f4SDimitry Andric /// @file
10480093f4SDimitry Andric /// This file contains the implementations of entities that describe floating
11480093f4SDimitry Andric /// point environment.
12480093f4SDimitry Andric //
13480093f4SDimitry Andric //===----------------------------------------------------------------------===//
14480093f4SDimitry Andric 
15480093f4SDimitry Andric #include "llvm/IR/FPEnv.h"
16*5ffd83dbSDimitry Andric #include "llvm/ADT/StringSwitch.h"
17480093f4SDimitry Andric 
18480093f4SDimitry Andric namespace llvm {
19480093f4SDimitry Andric 
20*5ffd83dbSDimitry Andric Optional<RoundingMode> StrToRoundingMode(StringRef RoundingArg) {
21480093f4SDimitry Andric   // For dynamic rounding mode, we use round to nearest but we will set the
22480093f4SDimitry Andric   // 'exact' SDNodeFlag so that the value will not be rounded.
23*5ffd83dbSDimitry Andric   return StringSwitch<Optional<RoundingMode>>(RoundingArg)
24*5ffd83dbSDimitry Andric       .Case("round.dynamic", RoundingMode::Dynamic)
25*5ffd83dbSDimitry Andric       .Case("round.tonearest", RoundingMode::NearestTiesToEven)
26*5ffd83dbSDimitry Andric       .Case("round.tonearestaway", RoundingMode::NearestTiesToAway)
27*5ffd83dbSDimitry Andric       .Case("round.downward", RoundingMode::TowardNegative)
28*5ffd83dbSDimitry Andric       .Case("round.upward", RoundingMode::TowardPositive)
29*5ffd83dbSDimitry Andric       .Case("round.towardzero", RoundingMode::TowardZero)
30480093f4SDimitry Andric       .Default(None);
31480093f4SDimitry Andric }
32480093f4SDimitry Andric 
33*5ffd83dbSDimitry Andric Optional<StringRef> RoundingModeToStr(RoundingMode UseRounding) {
34480093f4SDimitry Andric   Optional<StringRef> RoundingStr = None;
35480093f4SDimitry Andric   switch (UseRounding) {
36*5ffd83dbSDimitry Andric   case RoundingMode::Dynamic:
37480093f4SDimitry Andric     RoundingStr = "round.dynamic";
38480093f4SDimitry Andric     break;
39*5ffd83dbSDimitry Andric   case RoundingMode::NearestTiesToEven:
40480093f4SDimitry Andric     RoundingStr = "round.tonearest";
41480093f4SDimitry Andric     break;
42*5ffd83dbSDimitry Andric   case RoundingMode::NearestTiesToAway:
43*5ffd83dbSDimitry Andric     RoundingStr = "round.tonearestaway";
44*5ffd83dbSDimitry Andric     break;
45*5ffd83dbSDimitry Andric   case RoundingMode::TowardNegative:
46480093f4SDimitry Andric     RoundingStr = "round.downward";
47480093f4SDimitry Andric     break;
48*5ffd83dbSDimitry Andric   case RoundingMode::TowardPositive:
49480093f4SDimitry Andric     RoundingStr = "round.upward";
50480093f4SDimitry Andric     break;
51*5ffd83dbSDimitry Andric   case RoundingMode::TowardZero:
52480093f4SDimitry Andric     RoundingStr = "round.towardzero";
53480093f4SDimitry Andric     break;
54*5ffd83dbSDimitry Andric   default:
55*5ffd83dbSDimitry Andric     break;
56480093f4SDimitry Andric   }
57480093f4SDimitry Andric   return RoundingStr;
58480093f4SDimitry Andric }
59480093f4SDimitry Andric 
60480093f4SDimitry Andric Optional<fp::ExceptionBehavior> StrToExceptionBehavior(StringRef ExceptionArg) {
61480093f4SDimitry Andric   return StringSwitch<Optional<fp::ExceptionBehavior>>(ExceptionArg)
62480093f4SDimitry Andric       .Case("fpexcept.ignore", fp::ebIgnore)
63480093f4SDimitry Andric       .Case("fpexcept.maytrap", fp::ebMayTrap)
64480093f4SDimitry Andric       .Case("fpexcept.strict", fp::ebStrict)
65480093f4SDimitry Andric       .Default(None);
66480093f4SDimitry Andric }
67480093f4SDimitry Andric 
68480093f4SDimitry Andric Optional<StringRef> ExceptionBehaviorToStr(fp::ExceptionBehavior UseExcept) {
69480093f4SDimitry Andric   Optional<StringRef> ExceptStr = None;
70480093f4SDimitry Andric   switch (UseExcept) {
71480093f4SDimitry Andric   case fp::ebStrict:
72480093f4SDimitry Andric     ExceptStr = "fpexcept.strict";
73480093f4SDimitry Andric     break;
74480093f4SDimitry Andric   case fp::ebIgnore:
75480093f4SDimitry Andric     ExceptStr = "fpexcept.ignore";
76480093f4SDimitry Andric     break;
77480093f4SDimitry Andric   case fp::ebMayTrap:
78480093f4SDimitry Andric     ExceptStr = "fpexcept.maytrap";
79480093f4SDimitry Andric     break;
80480093f4SDimitry Andric   }
81480093f4SDimitry Andric   return ExceptStr;
82480093f4SDimitry Andric }
83*5ffd83dbSDimitry Andric } // namespace llvm
84