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 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 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 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 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