Skip to content

Commit e618aba

Browse files
committed
Add missing Neon Types
The AAPCS64 adds a number of vector types to the C unconditionally: https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#11appendix-support-for-advanced-simd-extensions The equivalent SVE types are already available in clang: https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#12appendix-support-for-scalable-vectors __mfp8 is defined in the ACLE https://arm-software.github.io/acle/main/acle.html#data-types I'm not sure whether __mfp8 should be defined for A32. For now I have left it as it is.
1 parent c1163b8 commit e618aba

17 files changed

+232
-7
lines changed

clang/include/clang/Basic/AArch64SVEACLETypes.def

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@
5757
// - IsBF true for vector of brain float elements.
5858
//===----------------------------------------------------------------------===//
5959

60+
#ifndef SVE_TYPE
61+
#define SVE_TYPE(Name, Id, SingletonId)
62+
#endif
63+
6064
#ifndef SVE_SCALAR_TYPE
6165
#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
6266
SVE_TYPE(Name, Id, SingletonId)
@@ -201,6 +205,39 @@ SVE_OPAQUE_TYPE(__SVCount_t, __SVCount_t, SveCount, SveCountTy)
201205

202206
SVE_SCALAR_TYPE(__mfp8, __mfp8, MFloat8, MFloat8Ty, 8)
203207

208+
#ifndef NEON_VECTOR_TYPE
209+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind)
210+
#endif
211+
NEON_VECTOR_TYPE(__Int8x8_t, CharTy, 8, 8, VectorKind::Neon)
212+
NEON_VECTOR_TYPE(__Int16x4_t, ShortTy, 16, 4, VectorKind::Neon)
213+
NEON_VECTOR_TYPE(__Int32x2_t, IntTy, 32, 2, VectorKind::Neon)
214+
NEON_VECTOR_TYPE(__Uint8x8_t, CharTy, 8, 8, VectorKind::Neon)
215+
NEON_VECTOR_TYPE(__Uint16x4_t, UnsignedShortTy, 16, 4, VectorKind::Neon)
216+
NEON_VECTOR_TYPE(__Uint32x2_t, UnsignedIntTy, 32, 2, VectorKind::Neon)
217+
NEON_VECTOR_TYPE(__Float16x4_t, Float16Ty, 16, 4, VectorKind::Neon)
218+
NEON_VECTOR_TYPE(__Float32x2_t, FloatTy, 32, 2, VectorKind::Neon)
219+
NEON_VECTOR_TYPE(__Poly8x8_t, CharTy, 8, 8, VectorKind::NeonPoly)
220+
NEON_VECTOR_TYPE(__Poly16x4_t, UnsignedShortTy, 16, 4, VectorKind::NeonPoly)
221+
NEON_VECTOR_TYPE(__Bfloat16x4_t, BFloat16Ty, 16, 4, VectorKind::Neon)
222+
NEON_VECTOR_TYPE(__Int8x16_t, CharTy, 18, 6, VectorKind::Neon)
223+
NEON_VECTOR_TYPE(__Int16x8_t, ShortTy, 16, 8, VectorKind::Neon)
224+
NEON_VECTOR_TYPE(__Int32x4_t, IntTy, 32, 4, VectorKind::Neon)
225+
NEON_VECTOR_TYPE(__Int64x2_t, LongLongTy, 64, 2, VectorKind::Neon)
226+
NEON_VECTOR_TYPE(__Uint8x16_t, CharTy, 18, 6, VectorKind::Neon)
227+
NEON_VECTOR_TYPE(__Uint16x8_t, UnsignedShortTy, 16, 8, VectorKind::Neon)
228+
NEON_VECTOR_TYPE(__Uint32x4_t, UnsignedIntTy, 32, 4, VectorKind::Neon)
229+
NEON_VECTOR_TYPE(__Uint64x2_t, UnsignedLongLongTy, 64, 2, VectorKind::Neon)
230+
NEON_VECTOR_TYPE(__Float16x8_t, Float16Ty, 16, 8, VectorKind::Neon)
231+
NEON_VECTOR_TYPE(__Float32x4_t, FloatTy, 32, 4, VectorKind::Neon)
232+
NEON_VECTOR_TYPE(__Float64x2_t, DoubleTy, 64, 2, VectorKind::Neon)
233+
NEON_VECTOR_TYPE(__Poly8x16_t, CharTy, 18, 6, VectorKind::NeonPoly)
234+
NEON_VECTOR_TYPE(__Poly16x8_t, UnsignedShortTy, 16, 8, VectorKind::NeonPoly)
235+
NEON_VECTOR_TYPE(__Poly64x2_t, UnsignedLongLongTy, 64, 2, VectorKind::NeonPoly)
236+
NEON_VECTOR_TYPE(__Bfloat16x8_t, BFloat16Ty, 16, 8, VectorKind::Neon)
237+
NEON_VECTOR_TYPE(__Mfloat8x8_t, MFloat8Ty, 8, 8, VectorKind::Neon)
238+
NEON_VECTOR_TYPE(__Mfloat8x16_t, MFloat8Ty, 16, 8, VectorKind::Neon)
239+
240+
#undef NEON_VECTOR_TYPE
204241
#undef SVE_VECTOR_TYPE
205242
#undef SVE_VECTOR_TYPE_MFLOAT
206243
#undef SVE_VECTOR_TYPE_BFLOAT

clang/include/clang/Basic/LangOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,7 @@ COMPATIBLE_VALUE_LANGOPT(FunctionAlignment, 5, 0, "Default alignment for functio
463463
COMPATIBLE_VALUE_LANGOPT(LoopAlignment, 32, 0, "Default alignment for loops")
464464

465465
LANGOPT(FixedPoint, 1, 0, "fixed point types")
466+
LANGOPT(ACLE, 1, 0, "Arm C Language Extensions")
466467
LANGOPT(PaddingOnUnsignedFixedPoint, 1, 0,
467468
"unsigned fixed point types having one extra padding bit")
468469

clang/include/clang/Basic/Specifiers.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ namespace clang {
9898
#define GENERIC_IMAGE_TYPE(ImgType, Id) \
9999
TST_##ImgType##_t, // OpenCL image types
100100
#include "clang/Basic/OpenCLImageTypes.def"
101+
102+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
103+
TST_##Name,
104+
#include "clang/Basic/AArch64SVEACLETypes.def"
105+
101106
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
102107
TST_##Name, // HLSL Intangible Types
103108
#include "clang/Basic/HLSLIntangibleTypes.def"

clang/include/clang/Basic/TokenKinds.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,11 @@ KEYWORD(__bool , KEYALTIVEC|KEYZVECTOR)
679679
ALIAS("__fp16", half , KEYALL)
680680
KEYWORD(__bf16 , KEYALL)
681681

682+
// ARM NEON types
683+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
684+
KEYWORD(Name, KEYACLE)
685+
#include "clang/Basic/AArch64SVEACLETypes.def"
686+
682687
// OpenCL Extension.
683688
KEYWORD(half , HALFSUPPORT)
684689

clang/include/clang/Sema/DeclSpec.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ class DeclSpec {
322322
#define GENERIC_IMAGE_TYPE(ImgType, Id) \
323323
static const TST TST_##ImgType##_t = clang::TST_##ImgType##_t;
324324
#include "clang/Basic/OpenCLImageTypes.def"
325+
326+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
327+
static const TST TST_##Name = clang::TST_##Name;
328+
#include "clang/Basic/AArch64SVEACLETypes.def"
329+
325330
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
326331
static const TST TST_##Name = clang::TST_##Name;
327332
#include "clang/Basic/HLSLIntangibleTypes.def"

clang/lib/AST/ASTContext.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,11 +1440,19 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
14401440

14411441
if (Target.hasAArch64SVETypes() ||
14421442
(AuxTarget && AuxTarget->hasAArch64SVETypes())) {
1443-
#define SVE_TYPE(Name, Id, SingletonId) \
1443+
#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
1444+
InitBuiltinType(SingletonId, BuiltinType::Id);
1445+
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
1446+
InitBuiltinType(SingletonId, BuiltinType::Id);
1447+
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
14441448
InitBuiltinType(SingletonId, BuiltinType::Id);
14451449
#include "clang/Basic/AArch64SVEACLETypes.def"
14461450
}
14471451

1452+
if (LangOpts.ACLE) {
1453+
InitBuiltinType(MFloat8Ty, BuiltinType::MFloat8);
1454+
}
1455+
14481456
if (Target.getTriple().isPPC64()) {
14491457
#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
14501458
InitBuiltinType(Id##Ty, BuiltinType::Id);
@@ -4429,7 +4437,6 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const {
44294437
#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
44304438
case BuiltinType::Id: \
44314439
return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4432-
#define SVE_TYPE(Name, Id, SingletonId)
44334440
#include "clang/Basic/AArch64SVEACLETypes.def"
44344441

44354442
#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
@@ -4500,7 +4507,6 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
45004507
#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
45014508
if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
45024509
return SingletonId;
4503-
#define SVE_TYPE(Name, Id, SingletonId)
45044510
#include "clang/Basic/AArch64SVEACLETypes.def"
45054511
} else if (Target->hasRISCVVTypes()) {
45064512
uint64_t EltTySize = getTypeSize(EltTy);

clang/lib/AST/Type.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2527,7 +2527,6 @@ bool Type::isSVESizelessBuiltinType() const {
25272527
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
25282528
case BuiltinType::Id: \
25292529
return true;
2530-
#define SVE_TYPE(Name, Id, SingletonId)
25312530
#include "clang/Basic/AArch64SVEACLETypes.def"
25322531
default:
25332532
return false;

clang/lib/Basic/IdentifierTable.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ enum TokenKey : unsigned {
111111
KEYNOZOS = 0x4000000,
112112
KEYHLSL = 0x8000000,
113113
KEYFIXEDPOINT = 0x10000000,
114-
KEYMAX = KEYFIXEDPOINT, // The maximum key
114+
KEYACLE = 0x20000000, // Enable Arm Neon vector type keywords
115+
KEYMAX = KEYACLE, // The maximum key
115116
KEYALLCXX = KEYCXX | KEYCXX11 | KEYCXX20,
116117
KEYALL = (KEYMAX | (KEYMAX - 1)) & ~KEYNOMS18 & ~KEYNOOPENCL &
117118
~KEYNOZOS // KEYNOMS18, KEYNOOPENCL, KEYNOZOS are excluded.
@@ -216,6 +217,8 @@ static KeywordStatus getKeywordStatusHelper(const LangOptions &LangOpts,
216217
return KS_Unknown;
217218
case KEYFIXEDPOINT:
218219
return LangOpts.FixedPoint ? KS_Enabled : KS_Disabled;
220+
case KEYACLE:
221+
return LangOpts.ACLE ? KS_Enabled : KS_Disabled;
219222
default:
220223
llvm_unreachable("Unknown KeywordStatus flag");
221224
}

clang/lib/Basic/LangOptions.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang,
203203
Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
204204
}
205205

206+
if (T.isARM() || T.isAArch64()) {
207+
Opts.ACLE = true;
208+
}
209+
210+
206211
// OpenCL, C++ and C23 have bool, true, false keywords.
207212
Opts.Bool = Opts.OpenCL || Opts.CPlusPlus || Opts.C23;
208213

clang/lib/CodeGen/CodeGenTypes.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,6 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
505505
case BuiltinType::Id:
506506
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
507507
case BuiltinType::Id:
508-
#define SVE_TYPE(Name, Id, SingletonId)
509508
#include "clang/Basic/AArch64SVEACLETypes.def"
510509
{
511510
ASTContext::BuiltinVectorTypeInfo Info =

clang/lib/CodeGen/Targets/AArch64.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,6 @@ bool AArch64ABIInfo::passAsPureScalableType(
766766
case BuiltinType::Id: \
767767
isPredicate = true; \
768768
break;
769-
#define SVE_TYPE(Name, Id, SingletonId)
770769
#include "clang/Basic/AArch64SVEACLETypes.def"
771770
default:
772771
return false;

clang/lib/Parse/ParseDecl.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4684,6 +4684,14 @@ void Parser::ParseDeclarationSpecifiers(
46844684
goto DoneWithDeclSpec; \
46854685
break;
46864686
#include "clang/Basic/OpenCLImageTypes.def"
4687+
4688+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
4689+
case tok::kw_##Name: \
4690+
isInvalid = DS.SetTypeSpecType(DeclSpec::TST_##Name, Loc, PrevSpec, \
4691+
DiagID, Policy); \
4692+
break;
4693+
#include "clang/Basic/AArch64SVEACLETypes.def"
4694+
46874695
case tok::kw___unknown_anytype:
46884696
isInvalid = DS.SetTypeSpecType(TST_unknown_anytype, Loc,
46894697
PrevSpec, DiagID, Policy);
@@ -6283,6 +6291,9 @@ bool Parser::isDeclarationSpecifier(
62836291
case tok::kw___read_only:
62846292
case tok::kw___read_write:
62856293
case tok::kw___write_only:
6294+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
6295+
case tok::kw_##Name:
6296+
#include "clang/Basic/AArch64SVEACLETypes.def"
62866297
#define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
62876298
#include "clang/Basic/OpenCLImageTypes.def"
62886299
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name:

clang/lib/Parse/ParseTentative.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1805,6 +1805,9 @@ Parser::isCXXDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename,
18051805
case tok::kw__Fract:
18061806
case tok::kw__Sat:
18071807
case tok::annot_pack_indexing_type:
1808+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
1809+
case tok::kw_##Name:
1810+
#include "clang/Basic/AArch64SVEACLETypes.def"
18081811
#define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
18091812
#include "clang/Basic/OpenCLImageTypes.def"
18101813
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name:
@@ -1933,6 +1936,9 @@ bool Parser::isCXXDeclarationSpecifierAType() {
19331936
case tok::kw__Accum:
19341937
case tok::kw__Fract:
19351938
case tok::kw__Sat:
1939+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
1940+
case tok::kw_##Name:
1941+
#include "clang/Basic/AArch64SVEACLETypes.def"
19361942
#define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
19371943
#include "clang/Basic/OpenCLImageTypes.def"
19381944
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case tok::kw_##Name:

clang/lib/Sema/DeclSpec.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,9 @@ bool Declarator::isDeclarationOfFunction() const {
374374
case TST_typename_pack_indexing:
375375
#define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t:
376376
#include "clang/Basic/OpenCLImageTypes.def"
377+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
378+
case TST_##Name:
379+
#include "clang/Basic/AArch64SVEACLETypes.def"
377380
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name:
378381
#include "clang/Basic/HLSLIntangibleTypes.def"
379382
return false;
@@ -607,6 +610,10 @@ const char *DeclSpec::getSpecifierName(DeclSpec::TST T,
607610
case DeclSpec::TST_##ImgType##_t: \
608611
return #ImgType "_t";
609612
#include "clang/Basic/OpenCLImageTypes.def"
613+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
614+
case DeclSpec::TST_##Name: \
615+
return #Name;
616+
#include "clang/Basic/AArch64SVEACLETypes.def"
610617
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
611618
case DeclSpec::TST_##Name: \
612619
return #Name;

clang/lib/Sema/SemaTemplateVariadic.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,9 @@ bool Sema::containsUnexpandedParameterPacks(Declarator &D) {
10811081
case TST_BFloat16:
10821082
#define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t:
10831083
#include "clang/Basic/OpenCLImageTypes.def"
1084+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
1085+
case TST_##Name:
1086+
#include "clang/Basic/AArch64SVEACLETypes.def"
10841087
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name:
10851088
#include "clang/Basic/HLSLIntangibleTypes.def"
10861089
case TST_unknown_anytype:

clang/lib/Sema/SemaType.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,12 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
13661366
break;
13671367
#include "clang/Basic/OpenCLImageTypes.def"
13681368

1369+
#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind) \
1370+
case DeclSpec::TST_##Name: \
1371+
Result = Context.getVectorType(Context.BaseType, ElBits, VectorKind); \
1372+
break;
1373+
#include "clang/Basic/AArch64SVEACLETypes.def"
1374+
13691375
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
13701376
case DeclSpec::TST_##Name: \
13711377
Result = Context.SingletonId; \

0 commit comments

Comments
 (0)