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