Home | History | Annotate | Line # | Download | only in IR
      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