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> convertStrToRoundingMode(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> convertRoundingModeToStr(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> 61 convertStrToExceptionBehavior(StringRef ExceptionArg) { 62 return StringSwitch<Optional<fp::ExceptionBehavior>>(ExceptionArg) 63 .Case("fpexcept.ignore", fp::ebIgnore) 64 .Case("fpexcept.maytrap", fp::ebMayTrap) 65 .Case("fpexcept.strict", fp::ebStrict) 66 .Default(None); 67 } 68 69 Optional<StringRef> 70 convertExceptionBehaviorToStr(fp::ExceptionBehavior UseExcept) { 71 Optional<StringRef> ExceptStr = None; 72 switch (UseExcept) { 73 case fp::ebStrict: 74 ExceptStr = "fpexcept.strict"; 75 break; 76 case fp::ebIgnore: 77 ExceptStr = "fpexcept.ignore"; 78 break; 79 case fp::ebMayTrap: 80 ExceptStr = "fpexcept.maytrap"; 81 break; 82 } 83 return ExceptStr; 84 } 85 } // namespace llvm 86