/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |* *| |* Enum Utility Declarations *| |* *| |* Automatically generated file, do not edit! *| |* From: ArithOps.td *| |* *| \*===----------------------------------------------------------------------===*/ namespace mlir::arith { // allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 enum class CmpFPredicate : uint64_t { AlwaysFalse = 0, OEQ = 1, OGT = 2, OGE = 3, OLT = 4, OLE = 5, ONE = 6, ORD = 7, UEQ = 8, UGT = 9, UGE = 10, ULT = 11, ULE = 12, UNE = 13, UNO = 14, AlwaysTrue = 15, }; ::std::optional symbolizeCmpFPredicate(uint64_t); ::llvm::StringRef stringifyCmpFPredicate(CmpFPredicate); ::std::optional symbolizeCmpFPredicate(::llvm::StringRef); inline constexpr unsigned getMaxEnumValForCmpFPredicate() { return 15; } inline ::llvm::StringRef stringifyEnum(CmpFPredicate enumValue) { return stringifyCmpFPredicate(enumValue); } template ::std::optional symbolizeEnum(::llvm::StringRef); template <> inline ::std::optional symbolizeEnum(::llvm::StringRef str) { return symbolizeCmpFPredicate(str); } class CmpFPredicateAttr : public ::mlir::IntegerAttr { public: using ValueType = CmpFPredicate; using ::mlir::IntegerAttr::IntegerAttr; static bool classof(::mlir::Attribute attr); static CmpFPredicateAttr get(::mlir::MLIRContext *context, CmpFPredicate val); CmpFPredicate getValue() const; }; } // namespace mlir::arith namespace mlir { template struct FieldParser; template<> struct FieldParser<::mlir::arith::CmpFPredicate, ::mlir::arith::CmpFPredicate> { template static FailureOr<::mlir::arith::CmpFPredicate> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword))) return parser.emitError(loc, "expected keyword for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15"); // Symbolize the keyword. if (::std::optional<::mlir::arith::CmpFPredicate> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::CmpFPredicate>(enumKeyword)) return *attr; return parser.emitError(loc, "expected one of [false, oeq, ogt, oge, olt, ole, one, ord, ueq, ugt, uge, ult, ule, une, uno, true] for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, got: ") << enumKeyword; } }; /// Support for std::optional, useful in attribute/type definition where the enum is /// used as: /// /// let parameters = (ins OptionalParameter<"std::optional">:$value); template<> struct FieldParser, std::optional<::mlir::arith::CmpFPredicate>> { template static FailureOr> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword, {"false", "oeq", "ogt", "oge", "olt", "ole", "one", "ord", "ueq", "ugt", "uge", "ult", "ule", "une", "uno", "true"}))) return std::optional<::mlir::arith::CmpFPredicate>{}; // Symbolize the keyword. if (::std::optional<::mlir::arith::CmpFPredicate> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::CmpFPredicate>(enumKeyword)) return attr; return parser.emitError(loc, "expected one of [false, oeq, ogt, oge, olt, ole, one, ord, ueq, ugt, uge, ult, ule, une, uno, true] for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, got: ") << enumKeyword; } }; } // namespace mlir namespace llvm { inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::mlir::arith::CmpFPredicate value) { auto valueStr = stringifyEnum(value); return p << valueStr; } } // namespace llvm namespace llvm { template<> struct DenseMapInfo<::mlir::arith::CmpFPredicate> { using StorageInfo = ::llvm::DenseMapInfo; static unsigned getHashValue(const ::mlir::arith::CmpFPredicate &val) { return StorageInfo::getHashValue(static_cast(val)); } static bool isEqual(const ::mlir::arith::CmpFPredicate &lhs, const ::mlir::arith::CmpFPredicate &rhs) { return lhs == rhs; } }; } namespace mlir::arith { // allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 enum class CmpIPredicate : uint64_t { eq = 0, ne = 1, slt = 2, sle = 3, sgt = 4, sge = 5, ult = 6, ule = 7, ugt = 8, uge = 9, }; ::std::optional symbolizeCmpIPredicate(uint64_t); ::llvm::StringRef stringifyCmpIPredicate(CmpIPredicate); ::std::optional symbolizeCmpIPredicate(::llvm::StringRef); inline constexpr unsigned getMaxEnumValForCmpIPredicate() { return 9; } inline ::llvm::StringRef stringifyEnum(CmpIPredicate enumValue) { return stringifyCmpIPredicate(enumValue); } template ::std::optional symbolizeEnum(::llvm::StringRef); template <> inline ::std::optional symbolizeEnum(::llvm::StringRef str) { return symbolizeCmpIPredicate(str); } class CmpIPredicateAttr : public ::mlir::IntegerAttr { public: using ValueType = CmpIPredicate; using ::mlir::IntegerAttr::IntegerAttr; static bool classof(::mlir::Attribute attr); static CmpIPredicateAttr get(::mlir::MLIRContext *context, CmpIPredicate val); CmpIPredicate getValue() const; }; } // namespace mlir::arith namespace mlir { template struct FieldParser; template<> struct FieldParser<::mlir::arith::CmpIPredicate, ::mlir::arith::CmpIPredicate> { template static FailureOr<::mlir::arith::CmpIPredicate> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword))) return parser.emitError(loc, "expected keyword for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9"); // Symbolize the keyword. if (::std::optional<::mlir::arith::CmpIPredicate> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::CmpIPredicate>(enumKeyword)) return *attr; return parser.emitError(loc, "expected one of [eq, ne, slt, sle, sgt, sge, ult, ule, ugt, uge] for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, got: ") << enumKeyword; } }; /// Support for std::optional, useful in attribute/type definition where the enum is /// used as: /// /// let parameters = (ins OptionalParameter<"std::optional">:$value); template<> struct FieldParser, std::optional<::mlir::arith::CmpIPredicate>> { template static FailureOr> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword, {"eq", "ne", "slt", "sle", "sgt", "sge", "ult", "ule", "ugt", "uge"}))) return std::optional<::mlir::arith::CmpIPredicate>{}; // Symbolize the keyword. if (::std::optional<::mlir::arith::CmpIPredicate> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::CmpIPredicate>(enumKeyword)) return attr; return parser.emitError(loc, "expected one of [eq, ne, slt, sle, sgt, sge, ult, ule, ugt, uge] for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, got: ") << enumKeyword; } }; } // namespace mlir namespace llvm { inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::mlir::arith::CmpIPredicate value) { auto valueStr = stringifyEnum(value); return p << valueStr; } } // namespace llvm namespace llvm { template<> struct DenseMapInfo<::mlir::arith::CmpIPredicate> { using StorageInfo = ::llvm::DenseMapInfo; static unsigned getHashValue(const ::mlir::arith::CmpIPredicate &val) { return StorageInfo::getHashValue(static_cast(val)); } static bool isEqual(const ::mlir::arith::CmpIPredicate &lhs, const ::mlir::arith::CmpIPredicate &rhs) { return lhs == rhs; } }; } namespace mlir::arith { // Integer overflow arith flags enum class IntegerOverflowFlags : uint32_t { none = 0, nsw = 1, nuw = 2, }; ::std::optional symbolizeIntegerOverflowFlags(uint32_t); std::string stringifyIntegerOverflowFlags(IntegerOverflowFlags); ::std::optional symbolizeIntegerOverflowFlags(::llvm::StringRef); inline constexpr IntegerOverflowFlags operator|(IntegerOverflowFlags a, IntegerOverflowFlags b) { return static_cast(static_cast(a) | static_cast(b)); } inline constexpr IntegerOverflowFlags operator&(IntegerOverflowFlags a, IntegerOverflowFlags b) { return static_cast(static_cast(a) & static_cast(b)); } inline constexpr IntegerOverflowFlags operator^(IntegerOverflowFlags a, IntegerOverflowFlags b) { return static_cast(static_cast(a) ^ static_cast(b)); } inline constexpr IntegerOverflowFlags &operator|=(IntegerOverflowFlags &a, IntegerOverflowFlags b) { return a = a | b; } inline constexpr IntegerOverflowFlags &operator&=(IntegerOverflowFlags &a, IntegerOverflowFlags b) { return a = a & b; } inline constexpr IntegerOverflowFlags &operator^=(IntegerOverflowFlags &a, IntegerOverflowFlags b) { return a = a ^ b; } inline constexpr IntegerOverflowFlags operator~(IntegerOverflowFlags bits) { // Ensure only bits that can be present in the enum are set return static_cast(~static_cast(bits) & static_cast(3u)); } inline constexpr bool bitEnumContainsAll(IntegerOverflowFlags bits, IntegerOverflowFlags bit) { return (bits & bit) == bit; } inline constexpr bool bitEnumContainsAny(IntegerOverflowFlags bits, IntegerOverflowFlags bit) { return (static_cast(bits) & static_cast(bit)) != 0; } inline constexpr IntegerOverflowFlags bitEnumClear(IntegerOverflowFlags bits, IntegerOverflowFlags bit) { return bits & ~bit; } inline constexpr IntegerOverflowFlags bitEnumSet(IntegerOverflowFlags bits, IntegerOverflowFlags bit, /*optional*/bool value=true) { return value ? (bits | bit) : bitEnumClear(bits, bit); } inline std::string stringifyEnum(IntegerOverflowFlags enumValue) { return stringifyIntegerOverflowFlags(enumValue); } template ::std::optional symbolizeEnum(::llvm::StringRef); template <> inline ::std::optional symbolizeEnum(::llvm::StringRef str) { return symbolizeIntegerOverflowFlags(str); } } // namespace mlir::arith namespace mlir { template struct FieldParser; template<> struct FieldParser<::mlir::arith::IntegerOverflowFlags, ::mlir::arith::IntegerOverflowFlags> { template static FailureOr<::mlir::arith::IntegerOverflowFlags> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword))) return parser.emitError(loc, "expected keyword for Integer overflow arith flags"); // Symbolize the keyword. if (::std::optional<::mlir::arith::IntegerOverflowFlags> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::IntegerOverflowFlags>(enumKeyword)) return *attr; return parser.emitError(loc, "expected one of [none, nsw, nuw] for Integer overflow arith flags, got: ") << enumKeyword; } }; /// Support for std::optional, useful in attribute/type definition where the enum is /// used as: /// /// let parameters = (ins OptionalParameter<"std::optional">:$value); template<> struct FieldParser, std::optional<::mlir::arith::IntegerOverflowFlags>> { template static FailureOr> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword, {"none", "nsw", "nuw"}))) return std::optional<::mlir::arith::IntegerOverflowFlags>{}; // Symbolize the keyword. if (::std::optional<::mlir::arith::IntegerOverflowFlags> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::IntegerOverflowFlags>(enumKeyword)) return attr; return parser.emitError(loc, "expected one of [none, nsw, nuw] for Integer overflow arith flags, got: ") << enumKeyword; } }; } // namespace mlir namespace llvm { inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::mlir::arith::IntegerOverflowFlags value) { auto valueStr = stringifyEnum(value); auto underlyingValue = static_cast>(value); if (underlyingValue && !llvm::has_single_bit(underlyingValue)) return p << '"' << valueStr << '"'; return p << valueStr; } } // namespace llvm namespace llvm { template<> struct DenseMapInfo<::mlir::arith::IntegerOverflowFlags> { using StorageInfo = ::llvm::DenseMapInfo; static unsigned getHashValue(const ::mlir::arith::IntegerOverflowFlags &val) { return StorageInfo::getHashValue(static_cast(val)); } static bool isEqual(const ::mlir::arith::IntegerOverflowFlags &lhs, const ::mlir::arith::IntegerOverflowFlags &rhs) { return lhs == rhs; } }; } namespace mlir::arith { // Floating point rounding mode enum class RoundingMode : uint32_t { to_nearest_even = 0, downward = 1, upward = 2, toward_zero = 3, to_nearest_away = 4, }; ::std::optional symbolizeRoundingMode(uint32_t); ::llvm::StringRef stringifyRoundingMode(RoundingMode); ::std::optional symbolizeRoundingMode(::llvm::StringRef); inline constexpr unsigned getMaxEnumValForRoundingMode() { return 4; } inline ::llvm::StringRef stringifyEnum(RoundingMode enumValue) { return stringifyRoundingMode(enumValue); } template ::std::optional symbolizeEnum(::llvm::StringRef); template <> inline ::std::optional symbolizeEnum(::llvm::StringRef str) { return symbolizeRoundingMode(str); } class RoundingModeAttr : public ::mlir::IntegerAttr { public: using ValueType = RoundingMode; using ::mlir::IntegerAttr::IntegerAttr; static bool classof(::mlir::Attribute attr); static RoundingModeAttr get(::mlir::MLIRContext *context, RoundingMode val); RoundingMode getValue() const; }; } // namespace mlir::arith namespace mlir { template struct FieldParser; template<> struct FieldParser<::mlir::arith::RoundingMode, ::mlir::arith::RoundingMode> { template static FailureOr<::mlir::arith::RoundingMode> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword))) return parser.emitError(loc, "expected keyword for Floating point rounding mode"); // Symbolize the keyword. if (::std::optional<::mlir::arith::RoundingMode> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::RoundingMode>(enumKeyword)) return *attr; return parser.emitError(loc, "expected one of [to_nearest_even, downward, upward, toward_zero, to_nearest_away] for Floating point rounding mode, got: ") << enumKeyword; } }; /// Support for std::optional, useful in attribute/type definition where the enum is /// used as: /// /// let parameters = (ins OptionalParameter<"std::optional">:$value); template<> struct FieldParser, std::optional<::mlir::arith::RoundingMode>> { template static FailureOr> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword, {"to_nearest_even", "downward", "upward", "toward_zero", "to_nearest_away"}))) return std::optional<::mlir::arith::RoundingMode>{}; // Symbolize the keyword. if (::std::optional<::mlir::arith::RoundingMode> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::RoundingMode>(enumKeyword)) return attr; return parser.emitError(loc, "expected one of [to_nearest_even, downward, upward, toward_zero, to_nearest_away] for Floating point rounding mode, got: ") << enumKeyword; } }; } // namespace mlir namespace llvm { inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::mlir::arith::RoundingMode value) { auto valueStr = stringifyEnum(value); return p << valueStr; } } // namespace llvm namespace llvm { template<> struct DenseMapInfo<::mlir::arith::RoundingMode> { using StorageInfo = ::llvm::DenseMapInfo; static unsigned getHashValue(const ::mlir::arith::RoundingMode &val) { return StorageInfo::getHashValue(static_cast(val)); } static bool isEqual(const ::mlir::arith::RoundingMode &lhs, const ::mlir::arith::RoundingMode &rhs) { return lhs == rhs; } }; } namespace mlir::arith { // allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 enum class AtomicRMWKind : uint64_t { addf = 0, addi = 1, andi = 2, assign = 3, maximumf = 4, maxnumf = 5, maxs = 6, maxu = 7, minimumf = 8, minnumf = 9, mins = 10, minu = 11, mulf = 12, muli = 13, ori = 14, xori = 15, }; ::std::optional symbolizeAtomicRMWKind(uint64_t); ::llvm::StringRef stringifyAtomicRMWKind(AtomicRMWKind); ::std::optional symbolizeAtomicRMWKind(::llvm::StringRef); inline constexpr unsigned getMaxEnumValForAtomicRMWKind() { return 15; } inline ::llvm::StringRef stringifyEnum(AtomicRMWKind enumValue) { return stringifyAtomicRMWKind(enumValue); } template ::std::optional symbolizeEnum(::llvm::StringRef); template <> inline ::std::optional symbolizeEnum(::llvm::StringRef str) { return symbolizeAtomicRMWKind(str); } class AtomicRMWKindAttr : public ::mlir::IntegerAttr { public: using ValueType = AtomicRMWKind; using ::mlir::IntegerAttr::IntegerAttr; static bool classof(::mlir::Attribute attr); static AtomicRMWKindAttr get(::mlir::MLIRContext *context, AtomicRMWKind val); AtomicRMWKind getValue() const; }; } // namespace mlir::arith namespace mlir { template struct FieldParser; template<> struct FieldParser<::mlir::arith::AtomicRMWKind, ::mlir::arith::AtomicRMWKind> { template static FailureOr<::mlir::arith::AtomicRMWKind> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword))) return parser.emitError(loc, "expected keyword for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15"); // Symbolize the keyword. if (::std::optional<::mlir::arith::AtomicRMWKind> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::AtomicRMWKind>(enumKeyword)) return *attr; return parser.emitError(loc, "expected one of [addf, addi, andi, assign, maximumf, maxnumf, maxs, maxu, minimumf, minnumf, mins, minu, mulf, muli, ori, xori] for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, got: ") << enumKeyword; } }; /// Support for std::optional, useful in attribute/type definition where the enum is /// used as: /// /// let parameters = (ins OptionalParameter<"std::optional">:$value); template<> struct FieldParser, std::optional<::mlir::arith::AtomicRMWKind>> { template static FailureOr> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword, {"addf", "addi", "andi", "assign", "maximumf", "maxnumf", "maxs", "maxu", "minimumf", "minnumf", "mins", "minu", "mulf", "muli", "ori", "xori"}))) return std::optional<::mlir::arith::AtomicRMWKind>{}; // Symbolize the keyword. if (::std::optional<::mlir::arith::AtomicRMWKind> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::AtomicRMWKind>(enumKeyword)) return attr; return parser.emitError(loc, "expected one of [addf, addi, andi, assign, maximumf, maxnumf, maxs, maxu, minimumf, minnumf, mins, minu, mulf, muli, ori, xori] for allowed 64-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, got: ") << enumKeyword; } }; } // namespace mlir namespace llvm { inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::mlir::arith::AtomicRMWKind value) { auto valueStr = stringifyEnum(value); return p << valueStr; } } // namespace llvm namespace llvm { template<> struct DenseMapInfo<::mlir::arith::AtomicRMWKind> { using StorageInfo = ::llvm::DenseMapInfo; static unsigned getHashValue(const ::mlir::arith::AtomicRMWKind &val) { return StorageInfo::getHashValue(static_cast(val)); } static bool isEqual(const ::mlir::arith::AtomicRMWKind &lhs, const ::mlir::arith::AtomicRMWKind &rhs) { return lhs == rhs; } }; } namespace mlir::arith { // Floating point fast math flags enum class FastMathFlags : uint32_t { none = 0, reassoc = 1, nnan = 2, ninf = 4, nsz = 8, arcp = 16, contract = 32, afn = 64, fast = 127, }; ::std::optional symbolizeFastMathFlags(uint32_t); std::string stringifyFastMathFlags(FastMathFlags); ::std::optional symbolizeFastMathFlags(::llvm::StringRef); inline constexpr FastMathFlags operator|(FastMathFlags a, FastMathFlags b) { return static_cast(static_cast(a) | static_cast(b)); } inline constexpr FastMathFlags operator&(FastMathFlags a, FastMathFlags b) { return static_cast(static_cast(a) & static_cast(b)); } inline constexpr FastMathFlags operator^(FastMathFlags a, FastMathFlags b) { return static_cast(static_cast(a) ^ static_cast(b)); } inline constexpr FastMathFlags &operator|=(FastMathFlags &a, FastMathFlags b) { return a = a | b; } inline constexpr FastMathFlags &operator&=(FastMathFlags &a, FastMathFlags b) { return a = a & b; } inline constexpr FastMathFlags &operator^=(FastMathFlags &a, FastMathFlags b) { return a = a ^ b; } inline constexpr FastMathFlags operator~(FastMathFlags bits) { // Ensure only bits that can be present in the enum are set return static_cast(~static_cast(bits) & static_cast(127u)); } inline constexpr bool bitEnumContainsAll(FastMathFlags bits, FastMathFlags bit) { return (bits & bit) == bit; } inline constexpr bool bitEnumContainsAny(FastMathFlags bits, FastMathFlags bit) { return (static_cast(bits) & static_cast(bit)) != 0; } inline constexpr FastMathFlags bitEnumClear(FastMathFlags bits, FastMathFlags bit) { return bits & ~bit; } inline constexpr FastMathFlags bitEnumSet(FastMathFlags bits, FastMathFlags bit, /*optional*/bool value=true) { return value ? (bits | bit) : bitEnumClear(bits, bit); } inline std::string stringifyEnum(FastMathFlags enumValue) { return stringifyFastMathFlags(enumValue); } template ::std::optional symbolizeEnum(::llvm::StringRef); template <> inline ::std::optional symbolizeEnum(::llvm::StringRef str) { return symbolizeFastMathFlags(str); } } // namespace mlir::arith namespace mlir { template struct FieldParser; template<> struct FieldParser<::mlir::arith::FastMathFlags, ::mlir::arith::FastMathFlags> { template static FailureOr<::mlir::arith::FastMathFlags> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword))) return parser.emitError(loc, "expected keyword for Floating point fast math flags"); // Symbolize the keyword. if (::std::optional<::mlir::arith::FastMathFlags> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::FastMathFlags>(enumKeyword)) return *attr; return parser.emitError(loc, "expected one of [none, reassoc, nnan, ninf, nsz, arcp, contract, afn, fast] for Floating point fast math flags, got: ") << enumKeyword; } }; /// Support for std::optional, useful in attribute/type definition where the enum is /// used as: /// /// let parameters = (ins OptionalParameter<"std::optional">:$value); template<> struct FieldParser, std::optional<::mlir::arith::FastMathFlags>> { template static FailureOr> parse(ParserT &parser) { // Parse the keyword/string containing the enum. std::string enumKeyword; auto loc = parser.getCurrentLocation(); if (failed(parser.parseOptionalKeywordOrString(&enumKeyword, {"none", "reassoc", "nnan", "ninf", "nsz", "arcp", "contract", "afn", "fast"}))) return std::optional<::mlir::arith::FastMathFlags>{}; // Symbolize the keyword. if (::std::optional<::mlir::arith::FastMathFlags> attr = ::mlir::arith::symbolizeEnum<::mlir::arith::FastMathFlags>(enumKeyword)) return attr; return parser.emitError(loc, "expected one of [none, reassoc, nnan, ninf, nsz, arcp, contract, afn, fast] for Floating point fast math flags, got: ") << enumKeyword; } }; } // namespace mlir namespace llvm { inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::mlir::arith::FastMathFlags value) { auto valueStr = stringifyEnum(value); switch (value) { case ::mlir::arith::FastMathFlags::fast: return p << valueStr; default: break; } auto underlyingValue = static_cast>(value); if (underlyingValue && !llvm::has_single_bit(underlyingValue)) return p << '"' << valueStr << '"'; return p << valueStr; } } // namespace llvm namespace llvm { template<> struct DenseMapInfo<::mlir::arith::FastMathFlags> { using StorageInfo = ::llvm::DenseMapInfo; static unsigned getHashValue(const ::mlir::arith::FastMathFlags &val) { return StorageInfo::getHashValue(static_cast(val)); } static bool isEqual(const ::mlir::arith::FastMathFlags &lhs, const ::mlir::arith::FastMathFlags &rhs) { return lhs == rhs; } }; }