1 //===- llvm/Support/FloatingPointMode.h -------------------------*- C++ -*-===// 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 // Utilities for dealing with flags related to floating point mode controls. 10 // 11 //===----------------------------------------------------------------------===/ 12 13 #ifndef LLVM_FLOATINGPOINTMODE_H 14 #define LLVM_FLOATINGPOINTMODE_H 15 16 #include "llvm/ADT/StringSwitch.h" 17 18 namespace llvm { 19 20 /// Represent handled modes for denormal (aka subnormal) modes in the floating 21 /// point environment. 22 enum class DenormalMode { 23 Invalid = -1, 24 25 /// IEEE-754 denormal numbers preserved. 26 IEEE, 27 28 /// The sign of a flushed-to-zero number is preserved in the sign of 0 29 PreserveSign, 30 31 /// Denormals are flushed to positive zero. 32 PositiveZero 33 }; 34 35 /// Parse the expected names from the denormal-fp-math attribute. 36 inline DenormalMode parseDenormalFPAttribute(StringRef Str) { 37 // Assume ieee on unspecified attribute. 38 return StringSwitch<DenormalMode>(Str) 39 .Cases("", "ieee", DenormalMode::IEEE) 40 .Case("preserve-sign", DenormalMode::PreserveSign) 41 .Case("positive-zero", DenormalMode::PositiveZero) 42 .Default(DenormalMode::Invalid); 43 } 44 45 /// Return the name used for the denormal handling mode used by the the 46 /// expected names from the denormal-fp-math attribute. 47 inline StringRef denormalModeName(DenormalMode Mode) { 48 switch (Mode) { 49 case DenormalMode::IEEE: 50 return "ieee"; 51 case DenormalMode::PreserveSign: 52 return "preserve-sign"; 53 case DenormalMode::PositiveZero: 54 return "positive-zero"; 55 default: 56 return ""; 57 } 58 } 59 60 } 61 62 #endif // LLVM_FLOATINGPOINTMODE_H 63