[clang] ac7fe42 - [Clang][AArch64]Refactor typespec handling in SveEmitter.cpp (#117717)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 2 08:35:01 PST 2024
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");
More information about the cfe-commits
mailing list