Author: SpencerAbson Date: 2024-12-02T16:34:57Z New Revision: ac7fe426163adf9123473aeb94448cf3e84f6d09
URL: https://github.com/llvm/llvm-project/commit/ac7fe426163adf9123473aeb94448cf3e84f6d09 DIFF: https://github.com/llvm/llvm-project/commit/ac7fe426163adf9123473aeb94448cf3e84f6d09.diff LOG: [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (#117717) - Switch to an enumerated type approach, which is less error-prone as we continue to add new types. This is similar to NeonEmitter. - Fix existing faulty typespec modifiers Added: Modified: clang/include/clang/Basic/arm_sve.td clang/utils/TableGen/SveEmitter.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/arm_sve.td b/clang/include/clang/Basic/arm_sve.td index b36e592042da0b..e551d6e46b8f33 100644 --- a/clang/include/clang/Basic/arm_sve.td +++ b/clang/include/clang/Basic/arm_sve.td @@ -762,14 +762,14 @@ def SVCMPLS_WIDE_N : SInst<"svcmple_wide[_n_{d}]", "PPdj", "UcUsUi", MergeNone, //////////////////////////////////////////////////////////////////////////////// // While comparisons -def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELE_S32 : SInst<"svwhilele_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELE_S64 : SInst<"svwhilele_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, "aarch64_sve_whilele", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELO_U32 : SInst<"svwhilelt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELO_U64 : SInst<"svwhilelt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, "aarch64_sve_whilelo", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELS_U32 : SInst<"svwhilele_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELS_U64 : SInst<"svwhilele_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, "aarch64_sve_whilels", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELT_S32 : SInst<"svwhilelt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILELT_S64 : SInst<"svwhilelt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, "aarch64_sve_whilelt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; //////////////////////////////////////////////////////////////////////////////// // Counting bit @@ -1365,10 +1365,10 @@ def SVWHILEGE_S32 : SInst<"svwhilege_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNon def SVWHILEGE_S64 : SInst<"svwhilege_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, "aarch64_sve_whilege", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; def SVWHILEGT_S32 : SInst<"svwhilegt_{d}[_{1}]", "Pkk", "PcPsPiPl", MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; def SVWHILEGT_S64 : SInst<"svwhilegt_{d}[_{1}]", "Pll", "PcPsPiPl", MergeNone, "aarch64_sve_whilegt", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; -def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PUcPUsPUiPUl", MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILEHI_U32 : SInst<"svwhilegt_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILEHI_U64 : SInst<"svwhilegt_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, "aarch64_sve_whilehi", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILEHS_U32 : SInst<"svwhilege_{d}[_{1}]", "Pmm", "PcPsPiPl", MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; +def SVWHILEHS_U64 : SInst<"svwhilege_{d}[_{1}]", "Pnn", "PcPsPiPl", MergeNone, "aarch64_sve_whilehs", [IsOverloadWhileOrMultiVecCvt, VerifyRuntimeMode]>; } let SVETargetGuard = "sve2p1", SMETargetGuard = "sme2" in { @@ -2326,7 +2326,7 @@ let SVETargetGuard = "sve2p1,bf16", SMETargetGuard = "sme2p1,bf16" in { // Multi-vector convert to/from floating-point. // let SVETargetGuard = InvalidMode, SMETargetGuard = "sme2" in { - def SVCVT_F16_X2 : SInst<"svcvt_f16[_f32_x2]", "e2", "f", MergeNone, "aarch64_sve_fcvt_x2", [IsStreaming],[]>; + def SVCVT_F16_X2 : SInst<"svcvt_f16[_f32_x2]", "h2", "f", MergeNone, "aarch64_sve_fcvt_x2", [IsStreaming],[]>; def SVCVT_BF16_X2 : SInst<"svcvt_bf16[_f32_x2]", "$2", "f", MergeNone, "aarch64_sve_bfcvt_x2", [IsOverloadNone, IsStreaming],[]>; def SVCVT_F32_U32_X2 : SInst<"svcvt_{d}[_u32_x2]", "2.d2.u", "f", MergeNone, "aarch64_sve_ucvtf_x2", [IsStreaming, IsOverloadWhileOrMultiVecCvt], []>; @@ -2348,7 +2348,7 @@ let SVETargetGuard = InvalidMode, SMETargetGuard = "sme-f16f16" in { // Multi-vector floating-point convert from single-precision to interleaved half-precision/BFloat16 // let SVETargetGuard = InvalidMode, SMETargetGuard = "sme2" in { - def SVCVTN_F16_X2 : SInst<"svcvtn_f16[_f32_x2]", "e2", "f", MergeNone, "aarch64_sve_fcvtn_x2", [IsStreaming],[]>; + def SVCVTN_F16_X2 : SInst<"svcvtn_f16[_f32_x2]", "h2", "f", MergeNone, "aarch64_sve_fcvtn_x2", [IsStreaming],[]>; def SVCVTN_BF16_X2 : SInst<"svcvtn_bf16[_f32_x2]", "$2", "f", MergeNone, "aarch64_sve_bfcvtn_x2", [IsOverloadNone, IsStreaming],[]>; } diff --git a/clang/utils/TableGen/SveEmitter.cpp b/clang/utils/TableGen/SveEmitter.cpp index e9fa01ea98dced..2d9f5c3381018a 100644 --- a/clang/utils/TableGen/SveEmitter.cpp +++ b/clang/utils/TableGen/SveEmitter.cpp @@ -50,20 +50,32 @@ using TypeSpec = std::string; namespace { class SVEType { - bool Float, Signed, Immediate, Void, Constant, Pointer, BFloat, MFloat; - bool DefaultType, IsScalable, Predicate, PredicatePattern, PrefetchOp, - Svcount, Fpm; + + enum TypeKind { + Invalid, + Void, + Float, + SInt, + UInt, + BFloat16, + MFloat8, + Svcount, + PrefetchOp, + PredicatePattern, + Predicate, + Fpm + }; + TypeKind Kind; + bool Immediate, Constant, Pointer, DefaultType, IsScalable; unsigned Bitwidth, ElementBitwidth, NumVectors; public: SVEType() : SVEType("", 'v') {} SVEType(StringRef TS, char CharMod, unsigned NumVectors = 1) - : Float(false), Signed(true), Immediate(false), Void(false), - Constant(false), Pointer(false), BFloat(false), MFloat(false), - DefaultType(false), IsScalable(true), Predicate(false), - PredicatePattern(false), PrefetchOp(false), Svcount(false), Fpm(false), - Bitwidth(128), ElementBitwidth(~0U), NumVectors(NumVectors) { + : Kind(Invalid), Immediate(false), Constant(false), Pointer(false), + DefaultType(false), IsScalable(true), Bitwidth(128), + ElementBitwidth(~0U), NumVectors(NumVectors) { if (!TS.empty()) applyTypespec(TS); applyModifier(CharMod); @@ -74,40 +86,39 @@ class SVEType { } bool isPointer() const { return Pointer; } - bool isVoidPointer() const { return Pointer && Void; } - bool isSigned() const { return Signed; } + bool isConstant() const { return Constant; } bool isImmediate() const { return Immediate; } bool isScalar() const { return NumVectors == 0; } bool isVector() const { return NumVectors > 0; } bool isScalableVector() const { return isVector() && IsScalable; } bool isFixedLengthVector() const { return isVector() && !IsScalable; } - bool isChar() const { return ElementBitwidth == 8 && !MFloat; } - bool isVoid() const { return Void && !Pointer; } + bool isChar() const { return ElementBitwidth == 8 && isInteger(); } + bool isVoid() const { return Kind == Void; } bool isDefault() const { return DefaultType; } - bool isFloat() const { return Float && !BFloat && !MFloat; } - bool isBFloat() const { return BFloat && !Float && !MFloat; } - bool isMFloat() const { - return MFloat && !BFloat && !Float; - } - bool isFloatingPoint() const { return Float || BFloat; } - bool isInteger() const { - return !isFloatingPoint() && !Predicate && !Svcount; + bool isFloat() const { return Kind == Float; } + bool isBFloat() const { return Kind == BFloat16; } + bool isMFloat() const { return Kind == MFloat8; } + bool isFloatingPoint() const { + return Kind == Float || Kind == BFloat16 || Kind == MFloat8; } + bool isInteger() const { return Kind == SInt || Kind == UInt; } + bool isSignedInteger() const { return Kind == SInt; } + bool isUnsignedInteger() const { return Kind == UInt; } bool isScalarPredicate() const { - return !isFloatingPoint() && Predicate && NumVectors == 0; + return Kind == Predicate && NumVectors == 0; } - bool isPredicateVector() const { return Predicate; } - bool isPredicatePattern() const { return PredicatePattern; } - bool isPrefetchOp() const { return PrefetchOp; } - bool isSvcount() const { return Svcount; } - bool isConstant() const { return Constant; } - bool isFpm() const { return Fpm; } + bool isPredicate() const { return Kind == Predicate; } + bool isPredicatePattern() const { return Kind == PredicatePattern; } + bool isPrefetchOp() const { return Kind == PrefetchOp; } + bool isSvcount() const { return Kind == Svcount; } + bool isFpm() const { return Kind == Fpm; } + bool isInvalid() const { return Kind == Invalid; } unsigned getElementSizeInBits() const { return ElementBitwidth; } unsigned getNumVectors() const { return NumVectors; } unsigned getNumElements() const { assert(ElementBitwidth != ~0U); - return Bitwidth / ElementBitwidth; + return isPredicate() ? 16 : (Bitwidth / ElementBitwidth); } unsigned getSizeInBits() const { return Bitwidth; @@ -127,6 +138,9 @@ class SVEType { /// Applies a prototype modifier to the type. void applyModifier(char Mod); + + /// Get the builtin base for this SVEType, e.g. 'Wi' for svint64_t. + std::string builtinBaseType() const; }; class SVEEmitter; @@ -424,173 +438,201 @@ const std::array<SVEEmitter::ReinterpretTypeInfo, 12> SVEEmitter::Reinterprets = // Type implementation //===----------------------------------------------------------------------===// -std::string SVEType::builtin_str() const { - std::string S; - if (isVoid()) +std::string SVEType::builtinBaseType() const { + switch (Kind) { + case TypeKind::Void: return "v"; - - if (isScalarPredicate()) - return "b"; - - if (isSvcount()) + case TypeKind::Svcount: return "Qa"; - - if (isVoidPointer()) - S += "v"; - else if (!isFloatingPoint()) + case TypeKind::PrefetchOp: + case TypeKind::PredicatePattern: + return "i"; + case TypeKind::Fpm: + return "Wi"; + case TypeKind::Predicate: + return "b"; + case TypeKind::BFloat16: + assert(ElementBitwidth == 16 && "Invalid BFloat16!"); + return "y"; + case TypeKind::MFloat8: + assert(ElementBitwidth == 8 && "Invalid MFloat8!"); + return "c"; + case TypeKind::Float: switch (ElementBitwidth) { - case 1: S += "b"; break; - case 8: S += "c"; break; - case 16: S += "s"; break; - case 32: S += "i"; break; - case 64: S += "Wi"; break; - case 128: S += "LLLi"; break; - default: llvm_unreachable("Unhandled case!"); + case 16: + return "h"; + case 32: + return "f"; + case 64: + return "d"; + default: + llvm_unreachable("Unhandled float width!"); } - else if (isFloat()) + case TypeKind::SInt: + case TypeKind::UInt: switch (ElementBitwidth) { - case 16: S += "h"; break; - case 32: S += "f"; break; - case 64: S += "d"; break; - default: llvm_unreachable("Unhandled case!"); + case 1: + return "b"; + case 8: + return "c"; + case 16: + return "s"; + case 32: + return "i"; + case 64: + return "Wi"; + case 128: + return "LLLi"; + default: + llvm_unreachable("Unhandled bitwidth!"); } - else if (isBFloat()) { - assert(ElementBitwidth == 16 && "Not a valid BFloat."); - S += "y"; - } else if (isMFloat()) { - assert(ElementBitwidth == 8 && "Not a valid MFloat."); - S += "m"; + case TypeKind::Invalid: + llvm_unreachable("Attempting to resolve builtin string from Invalid type!"); } + llvm_unreachable("Unhandled TypeKind!"); +} - if (!isFloatingPoint()) { - if ((isChar() || isPointer()) && !isVoidPointer()) { - // Make chars and typed pointers explicitly signed. - if (Signed) - S = "S" + S; - else if (!Signed) - S = "U" + S; - } else if (!isVoidPointer() && !Signed) { - S = "U" + S; - } +std::string SVEType::builtin_str() const { + std::string Prefix; + + if (isScalableVector()) + Prefix = "q" + llvm::utostr(getNumElements() * NumVectors); + else if (isFixedLengthVector()) + Prefix = "V" + llvm::utostr(getNumElements() * NumVectors); + else if (isImmediate()) { + assert(!isFloatingPoint() && "fp immediates are not supported"); + Prefix = "I"; } - // Constant indices are "int", but have the "constant expression" modifier. - if (isImmediate()) { - assert(!isFloat() && "fp immediates are not supported"); - S = "I" + S; - } + // Make chars and integer pointers explicitly signed. + if ((ElementBitwidth == 8 || isPointer()) && isSignedInteger()) + Prefix += "S"; + else if (isUnsignedInteger()) + Prefix += "U"; - if (isScalar()) { - if (Constant) S += "C"; - if (Pointer) S += "*"; - return S; - } + std::string BuiltinStr = Prefix + builtinBaseType(); + if (isConstant()) + BuiltinStr += "C"; + if (isPointer()) + BuiltinStr += "*"; - if (isFixedLengthVector()) - return "V" + utostr(getNumElements() * NumVectors) + S; - return "q" + utostr(getNumElements() * NumVectors) + S; + return BuiltinStr; } std::string SVEType::str() const { - if (isPredicatePattern()) - return "enum svpattern"; + std::string TypeStr; - if (isPrefetchOp()) + switch (Kind) { + case TypeKind::PrefetchOp: return "enum svprfop"; - - if (isFpm()) - return "fpm_t"; - - std::string S; - if (Void) - S += "void"; - else { - if (isScalableVector() || isSvcount()) - S += "sv"; - if (!Signed && !isFloatingPoint()) - S += "u"; - - if (Float) - S += "float"; - else if (isSvcount()) - S += "count"; - else if (isScalarPredicate() || isPredicateVector()) - S += "bool"; - else if (isBFloat()) - S += "bfloat"; - else if (isMFloat()) - S += "mfloat"; - else - S += "int"; - - if (!isScalarPredicate() && !isPredicateVector() && !isSvcount()) - S += utostr(ElementBitwidth); - if (isFixedLengthVector()) - S += "x" + utostr(getNumElements()); - if (NumVectors > 1) - S += "x" + utostr(NumVectors); - if (!isScalarPredicate()) - S += "_t"; + case TypeKind::PredicatePattern: + return "enum svpattern"; + case TypeKind::Fpm: + TypeStr += "fpm"; + break; + case TypeKind::Void: + TypeStr += "void"; + break; + case TypeKind::Float: + TypeStr += "float" + llvm::utostr(ElementBitwidth); + break; + case TypeKind::Svcount: + TypeStr += "svcount"; + break; + case TypeKind::Predicate: + TypeStr += "bool"; + break; + case TypeKind::BFloat16: + TypeStr += "bfloat16"; + break; + case TypeKind::MFloat8: + TypeStr += "mfloat8"; + break; + case TypeKind::SInt: + TypeStr += "int" + llvm::utostr(ElementBitwidth); + break; + case TypeKind::UInt: + TypeStr += "uint" + llvm::utostr(ElementBitwidth); + break; + case TypeKind::Invalid: + llvm_unreachable("Attempting to resolve type name from Invalid type!"); } - if (Constant) - S += " const"; - if (Pointer) - S += " *"; - - return S; + if (isFixedLengthVector()) + TypeStr += "x" + llvm::utostr(getNumElements()); + else if (isScalableVector()) + TypeStr = "sv" + TypeStr; + + if (NumVectors > 1) + TypeStr += "x" + llvm::utostr(NumVectors); + if (!isScalarPredicate() && !isVoid()) + TypeStr += "_t"; + if (isConstant()) + TypeStr += " const"; + if (isPointer()) + TypeStr += " *"; + + return TypeStr; } void SVEType::applyTypespec(StringRef TS) { for (char I : TS) { switch (I) { case 'Q': - Svcount = true; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = Svcount; break; case 'P': - Predicate = true; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = Predicate; break; case 'U': - Signed = false; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = UInt; break; case 'c': + Kind = isInvalid() ? SInt : Kind; ElementBitwidth = 8; break; case 's': + Kind = isInvalid() ? SInt : Kind; ElementBitwidth = 16; break; case 'i': + Kind = isInvalid() ? SInt : Kind; ElementBitwidth = 32; break; case 'l': + Kind = isInvalid() ? SInt : Kind; ElementBitwidth = 64; break; case 'q': + Kind = isInvalid() ? SInt : Kind; ElementBitwidth = 128; break; case 'h': - Float = true; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = Float; ElementBitwidth = 16; break; case 'f': - Float = true; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = Float; ElementBitwidth = 32; break; case 'd': - Float = true; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = Float; ElementBitwidth = 64; break; case 'b': - BFloat = true; - Float = false; - MFloat = false; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = BFloat16; ElementBitwidth = 16; break; case 'm': - Signed = false; - MFloat = true; - Float = false; - BFloat = false; + assert(isInvalid() && "Unexpected use of typespec modifier"); + Kind = MFloat8; ElementBitwidth = 8; break; default: @@ -603,7 +645,8 @@ void SVEType::applyTypespec(StringRef TS) { void SVEType::applyModifier(char Mod) { switch (Mod) { case 'v': - Void = true; + Kind = Void; + NumVectors = 0; break; case 'd': DefaultType = true; @@ -617,7 +660,7 @@ void SVEType::applyModifier(char Mod) { NumVectors = 0; break; case 'e': - Signed = false; + Kind = UInt; ElementBitwidth /= 2; break; case 'h': @@ -627,20 +670,14 @@ void SVEType::applyModifier(char Mod) { ElementBitwidth /= 4; break; case 'b': - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth /= 4; break; case 'o': ElementBitwidth *= 4; break; case 'P': - Signed = true; - Float = false; - BFloat = false; - Predicate = true; - Svcount = false; + Kind = Predicate; Bitwidth = 16; ElementBitwidth = 1; break; @@ -663,108 +700,66 @@ void SVEType::applyModifier(char Mod) { NumVectors = 0; break; case '@': - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth /= 4; NumVectors = 0; break; case 'K': - Signed = true; - Float = false; - BFloat = false; + Kind = SInt; Bitwidth = ElementBitwidth; NumVectors = 0; break; case 'L': - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; Bitwidth = ElementBitwidth; NumVectors = 0; break; case 'u': - Predicate = false; - Svcount = false; - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; break; case 'x': - Predicate = false; - Svcount = false; - Signed = true; - Float = false; - BFloat = false; + Kind = SInt; break; case 'i': - Predicate = false; - Svcount = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth = Bitwidth = 64; NumVectors = 0; - Signed = false; Immediate = true; break; case 'I': - Predicate = false; - Svcount = false; - Float = false; - BFloat = false; + Kind = PredicatePattern; ElementBitwidth = Bitwidth = 32; NumVectors = 0; - Signed = true; Immediate = true; - PredicatePattern = true; break; case 'J': - Predicate = false; - Svcount = false; - Float = false; - BFloat = false; + Kind = PrefetchOp; ElementBitwidth = Bitwidth = 32; NumVectors = 0; - Signed = true; Immediate = true; - PrefetchOp = true; break; case 'k': - Predicate = false; - Svcount = false; - Signed = true; - Float = false; - BFloat = false; + Kind = SInt; ElementBitwidth = Bitwidth = 32; NumVectors = 0; break; case 'l': - Predicate = false; - Svcount = false; - Signed = true; - Float = false; - BFloat = false; + Kind = SInt; ElementBitwidth = Bitwidth = 64; NumVectors = 0; break; case 'm': - Predicate = false; - Svcount = false; - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth = Bitwidth = 32; NumVectors = 0; break; case '>': - Fpm = true; - [[fallthrough]]; + Kind = Fpm; + ElementBitwidth = Bitwidth = 64; + NumVectors = 0; + break; case 'n': - Predicate = false; - Svcount = false; - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth = Bitwidth = 64; NumVectors = 0; break; @@ -776,167 +771,143 @@ void SVEType::applyModifier(char Mod) { NumVectors = 0; break; case 'f': - Signed = false; + Kind = UInt; ElementBitwidth = Bitwidth = 64; NumVectors = 0; break; case 'g': - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth = 64; break; case '[': - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth = 8; break; case 't': - Signed = true; - Float = false; - BFloat = false; + Kind = SInt; ElementBitwidth = 32; break; case 'z': - Signed = false; - Float = false; - BFloat = false; + Kind = UInt; ElementBitwidth = 32; break; case 'O': - Predicate = false; - Svcount = false; - Float = true; + Kind = Float; ElementBitwidth = 16; break; case 'M': - Predicate = false; - Svcount = false; - Float = true; - BFloat = false; + Kind = Float; ElementBitwidth = 32; break; case 'N': - Predicate = false; - Svcount = false; - Float = true; + Kind = Float; ElementBitwidth = 64; break; case 'Q': + Kind = Void; Constant = true; Pointer = true; - Void = true; NumVectors = 0; break; case 'S': + Kind = SInt; Constant = true; Pointer = true; ElementBitwidth = Bitwidth = 8; NumVectors = 0; - Signed = true; break; case 'W': + Kind = UInt; Constant = true; Pointer = true; ElementBitwidth = Bitwidth = 8; NumVectors = 0; - Signed = false; break; case 'T': + Kind = SInt; Constant = true; Pointer = true; ElementBitwidth = Bitwidth = 16; NumVectors = 0; - Signed = true; break; case 'X': + Kind = UInt; Constant = true; Pointer = true; ElementBitwidth = Bitwidth = 16; NumVectors = 0; - Signed = false; break; case 'Y': + Kind = UInt; Constant = true; Pointer = true; ElementBitwidth = Bitwidth = 32; NumVectors = 0; - Signed = false; break; case 'U': + Kind = SInt; Constant = true; Pointer = true; ElementBitwidth = Bitwidth = 32; NumVectors = 0; - Signed = true; break; case '%': + Kind = Void; Pointer = true; - Void = true; NumVectors = 0; break; case 'A': + Kind = SInt; Pointer = true; ElementBitwidth = Bitwidth = 8; NumVectors = 0; - Signed = true; break; case 'B': + Kind = SInt; Pointer = true; ElementBitwidth = Bitwidth = 16; NumVectors = 0; - Signed = true; break; case 'C': + Kind = SInt; Pointer = true; ElementBitwidth = Bitwidth = 32; NumVectors = 0; - Signed = true; break; case 'D': + Kind = SInt; Pointer = true; ElementBitwidth = Bitwidth = 64; NumVectors = 0; - Signed = true; break; case 'E': + Kind = UInt; Pointer = true; ElementBitwidth = Bitwidth = 8; NumVectors = 0; - Signed = false; break; case 'F': + Kind = UInt; Pointer = true; ElementBitwidth = Bitwidth = 16; NumVectors = 0; - Signed = false; break; case 'G': + Kind = UInt; Pointer = true; ElementBitwidth = Bitwidth = 32; NumVectors = 0; - Signed = false; break; case '$': - Predicate = false; - Svcount = false; - Float = false; - BFloat = true; + Kind = BFloat16; ElementBitwidth = 16; break; case '}': - Predicate = false; - Signed = true; - Svcount = true; + Kind = Svcount; NumVectors = 0; - Float = false; - BFloat = false; break; case '~': - Float = false; - BFloat = false; - MFloat = true; + Kind = MFloat8; ElementBitwidth = 8; break; case '.': @@ -1057,11 +1028,14 @@ std::string Intrinsic::replaceTemplatedArgs(std::string Name, TypeSpec TS, // Replace templated arg with the right suffix (e.g. u32) std::string TypeCode; - if (T.isInteger()) - TypeCode = T.isSigned() ? 's' : 'u'; + + if (T.isSignedInteger()) + TypeCode = 's'; + else if (T.isUnsignedInteger()) + TypeCode = 'u'; else if (T.isSvcount()) TypeCode = 'c'; - else if (T.isPredicateVector()) + else if (T.isPredicate()) TypeCode = 'b'; else if (T.isBFloat()) TypeCode = "bf"; @@ -1165,7 +1139,7 @@ uint64_t SVEEmitter::encodeTypeFlags(const SVEType &T) { return encodeEltType("EltTyMFloat8"); } - if (T.isPredicateVector() || T.isSvcount()) { + if (T.isPredicate() || T.isSvcount()) { switch (T.getElementSizeInBits()) { case 8: return encodeEltType("EltTyBool8"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits