diff --git a/clang/include/clang/Basic/AArch64SVEACLETypes.def b/clang/include/clang/Basic/AArch64SVEACLETypes.def index fa9c1ac0491c4..56e6179a664e2 100644 --- a/clang/include/clang/Basic/AArch64SVEACLETypes.def +++ b/clang/include/clang/Basic/AArch64SVEACLETypes.def @@ -8,28 +8,48 @@ // // This file defines various SVE builtin types. The macros are: // -// SVE_TYPE(Name, Id, SingletonId) - A builtin type that has not been -// covered by any other #define. Defining this macro covers all -// the builtins. +// SVE_TYPE: +// - (Name, MangledName, Id, SingletonId) +// A builtin type that has not been covered by any other #define. Defining +// this macro covers all the builtin types. // -// SVE_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, IsSigned, IsFP) - -// An SVE scalable vector. +// SVE_VECTOR_TYPE, SVE_PREDICATE_TYPE, SVE_OPAQUE_TYPE: +// - (Name, MangledName, Id, SingletonId) +// A builtin type that has not been covered by any other #define. Defining +// this macro covers the named subset of builtin types. // -// SVE_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) - An SVE scalable -// predicate. +// SVE_VECTOR_TYPE_INT +// - (Name, MangledName, Id, SingletonId, NumEls, ElBits, NF, IsSigned) +// Defining the macro covers the integer vector types. +// +// SVE_VECTOR_TYPE_FLOAT, SVE_VECTOR_TYPE_BFLOAT: +// - (Name, MangledName, Id, SingletonId, NumEls, ElBits, NF) +// Defining the macro covers the floating point vector types. +// +// SVE_PREDICATE_TYPE_ALL: +// - (Name, MangledName, Id, SingletonId, NumEls, NF) +// Defining the macro covers the boolean vector types. // // where: // // - Name is the name of the builtin type. // +// - MangledName is the mangled name of the builtin type. +// // - BuiltinType::Id is the enumerator defining the type. // // - Context.SingletonId is the global singleton of this type. // // - ElKind enumerates the type of the elements. // +// - NumEls enumerates the number of the elements. +// // - ElBits is the size of one element in bits. // +// - NF enumerates the number of sub-vectors. +// TODO: Tuple types are represented as a concatination of "NumEls x ElBits" +// vectors. This will be changed to become a struct containing NF vectors. +// // - IsSigned is true for vectors of signed integer elements and // for vectors of floating-point elements. // @@ -39,102 +59,134 @@ //===----------------------------------------------------------------------===// #ifndef SVE_VECTOR_TYPE -#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits, \ - IsSigned, IsFP, IsBF) \ +#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ SVE_TYPE(Name, Id, SingletonId) #endif +#ifndef SVE_VECTOR_TYPE_DETAILS +#define SVE_VECTOR_TYPE_DETAILS(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF, IsSigned, IsFP, IsBF) \ + SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) +#endif + +#ifndef SVE_VECTOR_TYPE_BFLOAT +#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF) \ + SVE_VECTOR_TYPE_DETAILS(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF, false, false, true) +#endif + +#ifndef SVE_VECTOR_TYPE_FLOAT +#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF) \ + SVE_VECTOR_TYPE_DETAILS(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF, false, true, false) +#endif + +#ifndef SVE_VECTOR_TYPE_INT +#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF, IsSigned) \ + SVE_VECTOR_TYPE_DETAILS(Name, MangledName, Id, SingletonId, NumEls, ElBits, NF, IsSigned, false, false) +#endif + #ifndef SVE_PREDICATE_TYPE -#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls) \ +#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ SVE_TYPE(Name, Id, SingletonId) #endif +#ifndef SVE_PREDICATE_TYPE_ALL +#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ + SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) +#endif + #ifndef SVE_OPAQUE_TYPE -#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ +#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ SVE_TYPE(Name, Id, SingletonId) #endif //===- Vector point types -----------------------------------------------===// +SVE_VECTOR_TYPE_INT("__SVInt8_t", "__SVInt8_t", SveInt8, SveInt8Ty, 16, 8, 1, true) +SVE_VECTOR_TYPE_INT("__SVInt16_t", "__SVInt16_t", SveInt16, SveInt16Ty, 8, 16, 1, true) +SVE_VECTOR_TYPE_INT("__SVInt32_t", "__SVInt32_t", SveInt32, SveInt32Ty, 4, 32, 1, true) +SVE_VECTOR_TYPE_INT("__SVInt64_t", "__SVInt64_t", SveInt64, SveInt64Ty, 2, 64, 1, true) -SVE_VECTOR_TYPE("__SVInt8_t", "__SVInt8_t", SveInt8, SveInt8Ty, 16, 8, true, false, false) -SVE_VECTOR_TYPE("__SVInt16_t", "__SVInt16_t", SveInt16, SveInt16Ty, 8, 16, true, false, false) -SVE_VECTOR_TYPE("__SVInt32_t", "__SVInt32_t", SveInt32, SveInt32Ty, 4, 32, true, false, false) -SVE_VECTOR_TYPE("__SVInt64_t", "__SVInt64_t", SveInt64, SveInt64Ty, 2, 64, true, false, false) - -SVE_VECTOR_TYPE("__SVUint8_t", "__SVUint8_t", SveUint8, SveUint8Ty, 16, 8, false, false, false) -SVE_VECTOR_TYPE("__SVUint16_t", "__SVUint16_t", SveUint16, SveUint16Ty, 8, 16, false, false, false) -SVE_VECTOR_TYPE("__SVUint32_t", "__SVUint32_t", SveUint32, SveUint32Ty, 4, 32, false, false, false) -SVE_VECTOR_TYPE("__SVUint64_t", "__SVUint64_t", SveUint64, SveUint64Ty, 2, 64, false, false, false) +SVE_VECTOR_TYPE_INT("__SVUint8_t", "__SVUint8_t", SveUint8, SveUint8Ty, 16, 8, 1, false) +SVE_VECTOR_TYPE_INT("__SVUint16_t", "__SVUint16_t", SveUint16, SveUint16Ty, 8, 16, 1, false) +SVE_VECTOR_TYPE_INT("__SVUint32_t", "__SVUint32_t", SveUint32, SveUint32Ty, 4, 32, 1, false) +SVE_VECTOR_TYPE_INT("__SVUint64_t", "__SVUint64_t", SveUint64, SveUint64Ty, 2, 64, 1, false) -SVE_VECTOR_TYPE("__SVFloat16_t", "__SVFloat16_t", SveFloat16, SveFloat16Ty, 8, 16, true, true, false) -SVE_VECTOR_TYPE("__SVFloat32_t", "__SVFloat32_t", SveFloat32, SveFloat32Ty, 4, 32, true, true, false) -SVE_VECTOR_TYPE("__SVFloat64_t", "__SVFloat64_t", SveFloat64, SveFloat64Ty, 2, 64, true, true, false) +SVE_VECTOR_TYPE_FLOAT("__SVFloat16_t", "__SVFloat16_t", SveFloat16, SveFloat16Ty, 8, 16, 1) +SVE_VECTOR_TYPE_FLOAT("__SVFloat32_t", "__SVFloat32_t", SveFloat32, SveFloat32Ty, 4, 32, 1) +SVE_VECTOR_TYPE_FLOAT("__SVFloat64_t", "__SVFloat64_t", SveFloat64, SveFloat64Ty, 2, 64, 1) -SVE_VECTOR_TYPE("__SVBfloat16_t", "__SVBfloat16_t", SveBFloat16, SveBFloat16Ty, 8, 16, true, false, true) +SVE_VECTOR_TYPE_BFLOAT("__SVBfloat16_t", "__SVBfloat16_t", SveBFloat16, SveBFloat16Ty, 8, 16, 1) // // x2 // -SVE_VECTOR_TYPE("__clang_svint8x2_t", "svint8x2_t", SveInt8x2, SveInt8x2Ty, 32, 8, true, false, false) -SVE_VECTOR_TYPE("__clang_svint16x2_t", "svint16x2_t", SveInt16x2, SveInt16x2Ty, 16, 16, true, false, false) -SVE_VECTOR_TYPE("__clang_svint32x2_t", "svint32x2_t", SveInt32x2, SveInt32x2Ty, 8, 32, true, false, false) -SVE_VECTOR_TYPE("__clang_svint64x2_t", "svint64x2_t", SveInt64x2, SveInt64x2Ty, 4, 64, true, false, false) -SVE_VECTOR_TYPE("__clang_svuint8x2_t", "svuint8x2_t", SveUint8x2, SveUint8x2Ty, 32, 8, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint16x2_t", "svuint16x2_t", SveUint16x2, SveUint16x2Ty, 16, 16, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint32x2_t", "svuint32x2_t", SveUint32x2, SveUint32x2Ty, 8, 32, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint64x2_t", "svuint64x2_t", SveUint64x2, SveUint64x2Ty, 4, 64, false, false, false) +SVE_VECTOR_TYPE_INT("__clang_svint8x2_t", "svint8x2_t", SveInt8x2, SveInt8x2Ty, 16, 8, 2, true) +SVE_VECTOR_TYPE_INT("__clang_svint16x2_t", "svint16x2_t", SveInt16x2, SveInt16x2Ty, 8, 16, 2, true) +SVE_VECTOR_TYPE_INT("__clang_svint32x2_t", "svint32x2_t", SveInt32x2, SveInt32x2Ty, 4, 32, 2, true) +SVE_VECTOR_TYPE_INT("__clang_svint64x2_t", "svint64x2_t", SveInt64x2, SveInt64x2Ty, 2, 64, 2, true) -SVE_VECTOR_TYPE("__clang_svfloat16x2_t", "svfloat16x2_t", SveFloat16x2, SveFloat16x2Ty, 16, 16, true, true, false) -SVE_VECTOR_TYPE("__clang_svfloat32x2_t", "svfloat32x2_t", SveFloat32x2, SveFloat32x2Ty, 8, 32, true, true, false) -SVE_VECTOR_TYPE("__clang_svfloat64x2_t", "svfloat64x2_t", SveFloat64x2, SveFloat64x2Ty, 4, 64, true, true, false) +SVE_VECTOR_TYPE_INT("__clang_svuint8x2_t", "svuint8x2_t", SveUint8x2, SveUint8x2Ty, 16 , 8, 2, false) +SVE_VECTOR_TYPE_INT("__clang_svuint16x2_t", "svuint16x2_t", SveUint16x2, SveUint16x2Ty, 8, 16, 2, false) +SVE_VECTOR_TYPE_INT("__clang_svuint32x2_t", "svuint32x2_t", SveUint32x2, SveUint32x2Ty, 4, 32, 2, false) +SVE_VECTOR_TYPE_INT("__clang_svuint64x2_t", "svuint64x2_t", SveUint64x2, SveUint64x2Ty, 2, 64, 2, false) + +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat16x2_t", "svfloat16x2_t", SveFloat16x2, SveFloat16x2Ty, 8, 16, 2) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat32x2_t", "svfloat32x2_t", SveFloat32x2, SveFloat32x2Ty, 4, 32, 2) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat64x2_t", "svfloat64x2_t", SveFloat64x2, SveFloat64x2Ty, 2, 64, 2) + +SVE_VECTOR_TYPE_BFLOAT("__clang_svbfloat16x2_t", "svbfloat16x2_t", SveBFloat16x2, SveBFloat16x2Ty, 8, 16, 2) -SVE_VECTOR_TYPE("__clang_svbfloat16x2_t", "svbfloat16x2_t", SveBFloat16x2, SveBFloat16x2Ty, 16, 16, true, false, true) // // x3 // -SVE_VECTOR_TYPE("__clang_svint8x3_t", "svint8x3_t", SveInt8x3, SveInt8x3Ty, 48, 8, true, false, false) -SVE_VECTOR_TYPE("__clang_svint16x3_t", "svint16x3_t", SveInt16x3, SveInt16x3Ty, 24, 16, true, false, false) -SVE_VECTOR_TYPE("__clang_svint32x3_t", "svint32x3_t", SveInt32x3, SveInt32x3Ty, 12, 32, true, false, false) -SVE_VECTOR_TYPE("__clang_svint64x3_t", "svint64x3_t", SveInt64x3, SveInt64x3Ty, 6, 64, true, false, false) -SVE_VECTOR_TYPE("__clang_svuint8x3_t", "svuint8x3_t", SveUint8x3, SveUint8x3Ty, 48, 8, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint16x3_t", "svuint16x3_t", SveUint16x3, SveUint16x3Ty, 24, 16, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint32x3_t", "svuint32x3_t", SveUint32x3, SveUint32x3Ty, 12, 32, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint64x3_t", "svuint64x3_t", SveUint64x3, SveUint64x3Ty, 6, 64, false, false, false) +SVE_VECTOR_TYPE_INT("__clang_svint8x3_t", "svint8x3_t", SveInt8x3, SveInt8x3Ty, 16, 8, 3, true) +SVE_VECTOR_TYPE_INT("__clang_svint16x3_t", "svint16x3_t", SveInt16x3, SveInt16x3Ty, 8, 16, 3, true) +SVE_VECTOR_TYPE_INT("__clang_svint32x3_t", "svint32x3_t", SveInt32x3, SveInt32x3Ty, 4, 32, 3, true) +SVE_VECTOR_TYPE_INT("__clang_svint64x3_t", "svint64x3_t", SveInt64x3, SveInt64x3Ty, 2, 64, 3, true) + +SVE_VECTOR_TYPE_INT("__clang_svuint8x3_t", "svuint8x3_t", SveUint8x3, SveUint8x3Ty, 16, 8, 3, false) +SVE_VECTOR_TYPE_INT("__clang_svuint16x3_t", "svuint16x3_t", SveUint16x3, SveUint16x3Ty, 8, 16, 3, false) +SVE_VECTOR_TYPE_INT("__clang_svuint32x3_t", "svuint32x3_t", SveUint32x3, SveUint32x3Ty, 4, 32, 3, false) +SVE_VECTOR_TYPE_INT("__clang_svuint64x3_t", "svuint64x3_t", SveUint64x3, SveUint64x3Ty, 2, 64, 3, false) -SVE_VECTOR_TYPE("__clang_svfloat16x3_t", "svfloat16x3_t", SveFloat16x3, SveFloat16x3Ty, 24, 16, true, true, false) -SVE_VECTOR_TYPE("__clang_svfloat32x3_t", "svfloat32x3_t", SveFloat32x3, SveFloat32x3Ty, 12, 32, true, true, false) -SVE_VECTOR_TYPE("__clang_svfloat64x3_t", "svfloat64x3_t", SveFloat64x3, SveFloat64x3Ty, 6, 64, true, true, false) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat16x3_t", "svfloat16x3_t", SveFloat16x3, SveFloat16x3Ty, 8, 16, 3) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat32x3_t", "svfloat32x3_t", SveFloat32x3, SveFloat32x3Ty, 4, 32, 3) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat64x3_t", "svfloat64x3_t", SveFloat64x3, SveFloat64x3Ty, 2, 64, 3) + +SVE_VECTOR_TYPE_BFLOAT("__clang_svbfloat16x3_t", "svbfloat16x3_t", SveBFloat16x3, SveBFloat16x3Ty, 8, 16, 3) -SVE_VECTOR_TYPE("__clang_svbfloat16x3_t", "svbfloat16x3_t", SveBFloat16x3, SveBFloat16x3Ty, 24, 16, true, false, true) // // x4 // -SVE_VECTOR_TYPE("__clang_svint8x4_t", "svint8x4_t", SveInt8x4, SveInt8x4Ty, 64, 8, true, false, false) -SVE_VECTOR_TYPE("__clang_svint16x4_t", "svint16x4_t", SveInt16x4, SveInt16x4Ty, 32, 16, true, false, false) -SVE_VECTOR_TYPE("__clang_svint32x4_t", "svint32x4_t", SveInt32x4, SveInt32x4Ty, 16, 32, true, false, false) -SVE_VECTOR_TYPE("__clang_svint64x4_t", "svint64x4_t", SveInt64x4, SveInt64x4Ty, 8, 64, true, false, false) -SVE_VECTOR_TYPE("__clang_svuint8x4_t", "svuint8x4_t", SveUint8x4, SveUint8x4Ty, 64, 8, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint16x4_t", "svuint16x4_t", SveUint16x4, SveUint16x4Ty, 32, 16, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint32x4_t", "svuint32x4_t", SveUint32x4, SveUint32x4Ty, 16, 32, false, false, false) -SVE_VECTOR_TYPE("__clang_svuint64x4_t", "svuint64x4_t", SveUint64x4, SveUint64x4Ty, 8, 64, false, false, false) +SVE_VECTOR_TYPE_INT("__clang_svint8x4_t", "svint8x4_t", SveInt8x4, SveInt8x4Ty, 16, 8, 4, true) +SVE_VECTOR_TYPE_INT("__clang_svint16x4_t", "svint16x4_t", SveInt16x4, SveInt16x4Ty, 8, 16, 4, true) +SVE_VECTOR_TYPE_INT("__clang_svint32x4_t", "svint32x4_t", SveInt32x4, SveInt32x4Ty, 4, 32, 4, true) +SVE_VECTOR_TYPE_INT("__clang_svint64x4_t", "svint64x4_t", SveInt64x4, SveInt64x4Ty, 2, 64, 4, true) + +SVE_VECTOR_TYPE_INT("__clang_svuint8x4_t", "svuint8x4_t", SveUint8x4, SveUint8x4Ty, 16, 8, 4, false) +SVE_VECTOR_TYPE_INT("__clang_svuint16x4_t", "svuint16x4_t", SveUint16x4, SveUint16x4Ty, 8, 16, 4, false) +SVE_VECTOR_TYPE_INT("__clang_svuint32x4_t", "svuint32x4_t", SveUint32x4, SveUint32x4Ty, 4, 32, 4, false) +SVE_VECTOR_TYPE_INT("__clang_svuint64x4_t", "svuint64x4_t", SveUint64x4, SveUint64x4Ty, 2, 64, 4, false) -SVE_VECTOR_TYPE("__clang_svfloat16x4_t", "svfloat16x4_t", SveFloat16x4, SveFloat16x4Ty, 32, 16, true, true, false) -SVE_VECTOR_TYPE("__clang_svfloat32x4_t", "svfloat32x4_t", SveFloat32x4, SveFloat32x4Ty, 16, 32, true, true, false) -SVE_VECTOR_TYPE("__clang_svfloat64x4_t", "svfloat64x4_t", SveFloat64x4, SveFloat64x4Ty, 8, 64, true, true, false) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat16x4_t", "svfloat16x4_t", SveFloat16x4, SveFloat16x4Ty, 8, 16, 4) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat32x4_t", "svfloat32x4_t", SveFloat32x4, SveFloat32x4Ty, 4, 32, 4) +SVE_VECTOR_TYPE_FLOAT("__clang_svfloat64x4_t", "svfloat64x4_t", SveFloat64x4, SveFloat64x4Ty, 2, 64, 4) -SVE_VECTOR_TYPE("__clang_svbfloat16x4_t", "svbfloat16x4_t", SveBFloat16x4, SveBFloat16x4Ty, 32, 16, true, false, true) +SVE_VECTOR_TYPE_BFLOAT("__clang_svbfloat16x4_t", "svbfloat16x4_t", SveBFloat16x4, SveBFloat16x4Ty, 8, 16, 4) -SVE_PREDICATE_TYPE("__SVBool_t", "__SVBool_t", SveBool, SveBoolTy, 16) -SVE_PREDICATE_TYPE("__clang_svboolx2_t", "svboolx2_t", SveBoolx2, SveBoolx2Ty, 32) -SVE_PREDICATE_TYPE("__clang_svboolx4_t", "svboolx4_t", SveBoolx4, SveBoolx4Ty, 64) +SVE_PREDICATE_TYPE_ALL("__SVBool_t", "__SVBool_t", SveBool, SveBoolTy, 16, 1) +SVE_PREDICATE_TYPE_ALL("__clang_svboolx2_t", "svboolx2_t", SveBoolx2, SveBoolx2Ty, 16, 2) +SVE_PREDICATE_TYPE_ALL("__clang_svboolx4_t", "svboolx4_t", SveBoolx4, SveBoolx4Ty, 16, 4) SVE_OPAQUE_TYPE("__SVCount_t", "__SVCount_t", SveCount, SveCountTy) #undef SVE_VECTOR_TYPE +#undef SVE_VECTOR_TYPE_BFLOAT +#undef SVE_VECTOR_TYPE_FLOAT +#undef SVE_VECTOR_TYPE_INT #undef SVE_PREDICATE_TYPE +#undef SVE_PREDICATE_TYPE_ALL #undef SVE_OPAQUE_TYPE #undef SVE_TYPE diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index fa9cc38efc466..8ece39a383046 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2203,13 +2203,12 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { // Because the length is only known at runtime, we use a dummy value // of 0 for the static length. The alignment values are those defined // by the Procedure Call Standard for the Arm Architecture. -#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits, \ - IsSigned, IsFP, IsBF) \ +#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: \ Width = 0; \ Align = 128; \ break; -#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls) \ +#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: \ Width = 0; \ Align = 16; \ @@ -4284,108 +4283,27 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const { switch (Ty->getKind()) { default: llvm_unreachable("Unsupported builtin vector type"); - case BuiltinType::SveInt8: - return SVE_INT_ELTTY(8, 16, true, 1); - case BuiltinType::SveUint8: - return SVE_INT_ELTTY(8, 16, false, 1); - case BuiltinType::SveInt8x2: - return SVE_INT_ELTTY(8, 16, true, 2); - case BuiltinType::SveUint8x2: - return SVE_INT_ELTTY(8, 16, false, 2); - case BuiltinType::SveInt8x3: - return SVE_INT_ELTTY(8, 16, true, 3); - case BuiltinType::SveUint8x3: - return SVE_INT_ELTTY(8, 16, false, 3); - case BuiltinType::SveInt8x4: - return SVE_INT_ELTTY(8, 16, true, 4); - case BuiltinType::SveUint8x4: - return SVE_INT_ELTTY(8, 16, false, 4); - case BuiltinType::SveInt16: - return SVE_INT_ELTTY(16, 8, true, 1); - case BuiltinType::SveUint16: - return SVE_INT_ELTTY(16, 8, false, 1); - case BuiltinType::SveInt16x2: - return SVE_INT_ELTTY(16, 8, true, 2); - case BuiltinType::SveUint16x2: - return SVE_INT_ELTTY(16, 8, false, 2); - case BuiltinType::SveInt16x3: - return SVE_INT_ELTTY(16, 8, true, 3); - case BuiltinType::SveUint16x3: - return SVE_INT_ELTTY(16, 8, false, 3); - case BuiltinType::SveInt16x4: - return SVE_INT_ELTTY(16, 8, true, 4); - case BuiltinType::SveUint16x4: - return SVE_INT_ELTTY(16, 8, false, 4); - case BuiltinType::SveInt32: - return SVE_INT_ELTTY(32, 4, true, 1); - case BuiltinType::SveUint32: - return SVE_INT_ELTTY(32, 4, false, 1); - case BuiltinType::SveInt32x2: - return SVE_INT_ELTTY(32, 4, true, 2); - case BuiltinType::SveUint32x2: - return SVE_INT_ELTTY(32, 4, false, 2); - case BuiltinType::SveInt32x3: - return SVE_INT_ELTTY(32, 4, true, 3); - case BuiltinType::SveUint32x3: - return SVE_INT_ELTTY(32, 4, false, 3); - case BuiltinType::SveInt32x4: - return SVE_INT_ELTTY(32, 4, true, 4); - case BuiltinType::SveUint32x4: - return SVE_INT_ELTTY(32, 4, false, 4); - case BuiltinType::SveInt64: - return SVE_INT_ELTTY(64, 2, true, 1); - case BuiltinType::SveUint64: - return SVE_INT_ELTTY(64, 2, false, 1); - case BuiltinType::SveInt64x2: - return SVE_INT_ELTTY(64, 2, true, 2); - case BuiltinType::SveUint64x2: - return SVE_INT_ELTTY(64, 2, false, 2); - case BuiltinType::SveInt64x3: - return SVE_INT_ELTTY(64, 2, true, 3); - case BuiltinType::SveUint64x3: - return SVE_INT_ELTTY(64, 2, false, 3); - case BuiltinType::SveInt64x4: - return SVE_INT_ELTTY(64, 2, true, 4); - case BuiltinType::SveUint64x4: - return SVE_INT_ELTTY(64, 2, false, 4); - case BuiltinType::SveBool: - return SVE_ELTTY(BoolTy, 16, 1); - case BuiltinType::SveBoolx2: - return SVE_ELTTY(BoolTy, 16, 2); - case BuiltinType::SveBoolx4: - return SVE_ELTTY(BoolTy, 16, 4); - case BuiltinType::SveFloat16: - return SVE_ELTTY(HalfTy, 8, 1); - case BuiltinType::SveFloat16x2: - return SVE_ELTTY(HalfTy, 8, 2); - case BuiltinType::SveFloat16x3: - return SVE_ELTTY(HalfTy, 8, 3); - case BuiltinType::SveFloat16x4: - return SVE_ELTTY(HalfTy, 8, 4); - case BuiltinType::SveFloat32: - return SVE_ELTTY(FloatTy, 4, 1); - case BuiltinType::SveFloat32x2: - return SVE_ELTTY(FloatTy, 4, 2); - case BuiltinType::SveFloat32x3: - return SVE_ELTTY(FloatTy, 4, 3); - case BuiltinType::SveFloat32x4: - return SVE_ELTTY(FloatTy, 4, 4); - case BuiltinType::SveFloat64: - return SVE_ELTTY(DoubleTy, 2, 1); - case BuiltinType::SveFloat64x2: - return SVE_ELTTY(DoubleTy, 2, 2); - case BuiltinType::SveFloat64x3: - return SVE_ELTTY(DoubleTy, 2, 3); - case BuiltinType::SveFloat64x4: - return SVE_ELTTY(DoubleTy, 2, 4); - case BuiltinType::SveBFloat16: - return SVE_ELTTY(BFloat16Ty, 8, 1); - case BuiltinType::SveBFloat16x2: - return SVE_ELTTY(BFloat16Ty, 8, 2); - case BuiltinType::SveBFloat16x3: - return SVE_ELTTY(BFloat16Ty, 8, 3); - case BuiltinType::SveBFloat16x4: - return SVE_ELTTY(BFloat16Ty, 8, 4); + +#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \ + ElBits, NF, IsSigned) \ + case BuiltinType::Id: \ + return {getIntTypeForBitwidth(ElBits, IsSigned), \ + llvm::ElementCount::getScalable(NumEls), NF}; +#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \ + ElBits, NF) \ + case BuiltinType::Id: \ + return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \ + llvm::ElementCount::getScalable(NumEls), NF}; +#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \ + ElBits, NF) \ + case BuiltinType::Id: \ + return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF}; +#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ + case BuiltinType::Id: \ + return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF}; +#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) +#include "clang/Basic/AArch64SVEACLETypes.def" + #define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \ IsSigned) \ case BuiltinType::Id: \ @@ -4425,22 +4343,30 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields) const { if (Target->hasAArch64SVETypes()) { uint64_t EltTySize = getTypeSize(EltTy); -#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits, \ - IsSigned, IsFP, IsBF) \ - if (!EltTy->isBooleanType() && \ - ((EltTy->hasIntegerRepresentation() && \ - EltTy->hasSignedIntegerRepresentation() == IsSigned) || \ - (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \ - IsFP && !IsBF) || \ - (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \ - IsBF && !IsFP)) && \ - EltTySize == ElBits && NumElts == NumEls) { \ + +#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \ + ElBits, NF, IsSigned) \ + if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \ + EltTy->hasSignedIntegerRepresentation() == IsSigned && \ + EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \ return SingletonId; \ } -#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls) \ - if (EltTy->isBooleanType() && NumElts == NumEls) \ +#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \ + ElBits, NF) \ + if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \ + EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \ + return SingletonId; \ + } +#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \ + ElBits, NF) \ + if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \ + EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \ + return SingletonId; \ + } +#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ + if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \ return SingletonId; -#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingleTonId) +#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) #include "clang/Basic/AArch64SVEACLETypes.def" } else if (Target->hasRISCVVTypes()) { uint64_t EltTySize = getTypeSize(EltTy); diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 7d638befcbd3f..b6e1da0c3192d 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -3384,8 +3384,7 @@ void CXXNameMangler::mangleType(const BuiltinType *T) { // The SVE types are effectively target-specific. The mangling scheme // is defined in the appendices to the Procedure Call Standard for the // Arm Architecture. -#define SVE_VECTOR_TYPE(InternalName, MangledName, Id, SingletonId, NumEls, \ - ElBits, IsSigned, IsFP, IsBF) \ +#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: \ if (T->getKind() == BuiltinType::SveBFloat16 && \ isCompatibleWith(LangOptions::ClangABI::Ver17)) { \ @@ -3394,21 +3393,18 @@ void CXXNameMangler::mangleType(const BuiltinType *T) { Out << "u" << type_name.size() << type_name; \ } else { \ type_name = MangledName; \ - Out << (type_name == InternalName ? "u" : "") << type_name.size() \ - << type_name; \ + Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \ } \ break; -#define SVE_PREDICATE_TYPE(InternalName, MangledName, Id, SingletonId, NumEls) \ +#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: \ type_name = MangledName; \ - Out << (type_name == InternalName ? "u" : "") << type_name.size() \ - << type_name; \ + Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \ break; -#define SVE_OPAQUE_TYPE(InternalName, MangledName, Id, SingletonId) \ +#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ case BuiltinType::Id: \ type_name = MangledName; \ - Out << (type_name == InternalName ? "u" : "") << type_name.size() \ - << type_name; \ + Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \ break; #include "clang/Basic/AArch64SVEACLETypes.def" #define PPC_VECTOR_TYPE(Name, Id, Size) \ diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index 11a577bbdd078..5eebd8ad2a065 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -500,63 +500,19 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) { case BuiltinType::OCLReserveID: ResultType = CGM.getOpenCLRuntime().convertOpenCLSpecificType(Ty); break; - case BuiltinType::SveInt8: - case BuiltinType::SveUint8: - case BuiltinType::SveInt8x2: - case BuiltinType::SveUint8x2: - case BuiltinType::SveInt8x3: - case BuiltinType::SveUint8x3: - case BuiltinType::SveInt8x4: - case BuiltinType::SveUint8x4: - case BuiltinType::SveInt16: - case BuiltinType::SveUint16: - case BuiltinType::SveInt16x2: - case BuiltinType::SveUint16x2: - case BuiltinType::SveInt16x3: - case BuiltinType::SveUint16x3: - case BuiltinType::SveInt16x4: - case BuiltinType::SveUint16x4: - case BuiltinType::SveInt32: - case BuiltinType::SveUint32: - case BuiltinType::SveInt32x2: - case BuiltinType::SveUint32x2: - case BuiltinType::SveInt32x3: - case BuiltinType::SveUint32x3: - case BuiltinType::SveInt32x4: - case BuiltinType::SveUint32x4: - case BuiltinType::SveInt64: - case BuiltinType::SveUint64: - case BuiltinType::SveInt64x2: - case BuiltinType::SveUint64x2: - case BuiltinType::SveInt64x3: - case BuiltinType::SveUint64x3: - case BuiltinType::SveInt64x4: - case BuiltinType::SveUint64x4: - case BuiltinType::SveBool: - case BuiltinType::SveBoolx2: - case BuiltinType::SveBoolx4: - case BuiltinType::SveFloat16: - case BuiltinType::SveFloat16x2: - case BuiltinType::SveFloat16x3: - case BuiltinType::SveFloat16x4: - case BuiltinType::SveFloat32: - case BuiltinType::SveFloat32x2: - case BuiltinType::SveFloat32x3: - case BuiltinType::SveFloat32x4: - case BuiltinType::SveFloat64: - case BuiltinType::SveFloat64x2: - case BuiltinType::SveFloat64x3: - case BuiltinType::SveFloat64x4: - case BuiltinType::SveBFloat16: - case BuiltinType::SveBFloat16x2: - case BuiltinType::SveBFloat16x3: - case BuiltinType::SveBFloat16x4: { - ASTContext::BuiltinVectorTypeInfo Info = - Context.getBuiltinVectorTypeInfo(cast(Ty)); - return llvm::ScalableVectorType::get(ConvertType(Info.ElementType), - Info.EC.getKnownMinValue() * - Info.NumVectors); - } +#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ + case BuiltinType::Id: +#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ + case BuiltinType::Id: +#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) +#include "clang/Basic/AArch64SVEACLETypes.def" + { + ASTContext::BuiltinVectorTypeInfo Info = + Context.getBuiltinVectorTypeInfo(cast(Ty)); + return llvm::ScalableVectorType::get(ConvertType(Info.ElementType), + Info.EC.getKnownMinValue() * + Info.NumVectors); + } case BuiltinType::SveCount: return llvm::TargetExtType::get(getLLVMContext(), "aarch64.svcount"); #define PPC_VECTOR_TYPE(Name, Id, Size) \