[FMV][AArch64] Expand feature dependencies using AArch64::ExtensionSet. (#113281)
Currently we maintain a hand written list of subtarget features which we are implied for a given FMV feature. It is more robust to expand such dependencies using ExtensionDependency from TargetParser, since that is generated by tablegen. For this to work each FMV feature must have a corresponding SubtargetFeature in place. FMV features which didn't satisfy this criteria have been removed from the ACLE specification (https://github.com/ARM-software/acle/pull/315). However, I deliberately marked the ArchExtKind in FMVInfo structure as std::optional in case we decide to break this rule in the future. I have also added the missing dependencies: * FEAT_DPB2 -> FEAT_DPB * FEAT_FlagM2 -> FEAT_FlagM
This commit is contained in:
parent
99f44c8fed
commit
3cc852ece4
@ -14300,10 +14300,12 @@ QualType ASTContext::getCorrespondingSignedFixedPointType(QualType Ty) const {
|
||||
static std::vector<std::string> getFMVBackendFeaturesFor(
|
||||
const llvm::SmallVectorImpl<StringRef> &FMVFeatStrings) {
|
||||
std::vector<std::string> BackendFeats;
|
||||
llvm::AArch64::ExtensionSet FeatureBits;
|
||||
for (StringRef F : FMVFeatStrings)
|
||||
if (auto FMVExt = llvm::AArch64::parseFMVExtension(F))
|
||||
for (StringRef F : FMVExt->getImpliedFeatures())
|
||||
BackendFeats.push_back(F.str());
|
||||
if (FMVExt->ID)
|
||||
FeatureBits.enable(*FMVExt->ID);
|
||||
FeatureBits.toLLVMFeatureList(BackendFeats);
|
||||
return BackendFeats;
|
||||
}
|
||||
|
||||
|
@ -722,7 +722,7 @@ unsigned AArch64TargetInfo::multiVersionFeatureCost() const {
|
||||
bool AArch64TargetInfo::doesFeatureAffectCodeGen(StringRef Name) const {
|
||||
// FMV extensions which imply no backend features do not affect codegen.
|
||||
if (auto Ext = llvm::AArch64::parseFMVExtension(Name))
|
||||
return !Ext->Features.empty();
|
||||
return Ext->ID.has_value();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ __attribute__((target_version("flagm"))) int fmv(void) { return 0; }
|
||||
// CHECK: define dso_local i32 @fmv._Mflagm2() #[[flagm2:[0-9]+]] {
|
||||
__attribute__((target_version("flagm2"))) int fmv(void) { return 0; }
|
||||
|
||||
// CHECK: define dso_local i32 @fmv._Mfp() #[[ATTR0:[0-9]+]] {
|
||||
// CHECK: define dso_local i32 @fmv._Mfp() #[[default:[0-9]+]] {
|
||||
__attribute__((target_version("fp"))) int fmv(void) { return 0; }
|
||||
|
||||
// CHECK: define dso_local i32 @fmv._Mfp16() #[[fp16:[0-9]+]] {
|
||||
@ -78,7 +78,7 @@ __attribute__((target_version("predres"))) int fmv(void) { return 0; }
|
||||
// CHECK: define dso_local i32 @fmv._Mrcpc() #[[rcpc:[0-9]+]] {
|
||||
__attribute__((target_version("rcpc"))) int fmv(void) { return 0; }
|
||||
|
||||
// CHECK: define dso_local i32 @fmv._Mrcpc2() #[[rcpc:[0-9]+]] {
|
||||
// CHECK: define dso_local i32 @fmv._Mrcpc2() #[[rcpc2:[0-9]+]] {
|
||||
__attribute__((target_version("rcpc2"))) int fmv(void) { return 0; }
|
||||
|
||||
// CHECK: define dso_local i32 @fmv._Mrcpc3() #[[rcpc3:[0-9]+]] {
|
||||
@ -99,7 +99,7 @@ __attribute__((target_version("sha2"))) int fmv(void) { return 0; }
|
||||
// CHECK: define dso_local i32 @fmv._Msha3() #[[sha3:[0-9]+]] {
|
||||
__attribute__((target_version("sha3"))) int fmv(void) { return 0; }
|
||||
|
||||
// CHECK: define dso_local i32 @fmv._Msimd() #[[ATTR0:[0-9]+]] {
|
||||
// CHECK: define dso_local i32 @fmv._Msimd() #[[default]] {
|
||||
__attribute__((target_version("simd"))) int fmv(void) { return 0; }
|
||||
|
||||
// CHECK: define dso_local i32 @fmv._Msm4() #[[sm4:[0-9]+]] {
|
||||
@ -163,7 +163,7 @@ int caller() {
|
||||
// CHECK: attributes #[[fcma]] = { {{.*}} "target-features"="+complxnum,+fp-armv8,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[flagm]] = { {{.*}} "target-features"="+flagm,+fp-armv8,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[flagm2]] = { {{.*}} "target-features"="+altnzcv,+flagm,+fp-armv8,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[ATTR0]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[default]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[fp16]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[fp16fml]] = { {{.*}} "target-features"="+fp-armv8,+fp16fml,+fullfp16,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[frintts]] = { {{.*}} "target-features"="+fp-armv8,+fptoint,+neon,+outline-atomics,+v8a"
|
||||
@ -175,7 +175,8 @@ int caller() {
|
||||
// CHECK: attributes #[[mops]] = { {{.*}} "target-features"="+fp-armv8,+mops,+neon,+outline-atomics,+v8a"
|
||||
// CHECK: attributes #[[predres]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+predres,+v8a"
|
||||
// CHECK: attributes #[[rcpc]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+v8a"
|
||||
// CHECK: attributes #[[rcpc3]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+rcpc3,+v8a"
|
||||
// CHECK: attributes #[[rcpc2]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+rcpc-immo,+v8a"
|
||||
// CHECK: attributes #[[rcpc3]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rcpc,+rcpc-immo,+rcpc3,+v8a"
|
||||
// CHECK: attributes #[[rdm]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rdm,+v8a"
|
||||
// CHECK: attributes #[[rng]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+rand,+v8a"
|
||||
// CHECK: attributes #[[sb]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+sb,+v8a"
|
||||
@ -191,6 +192,6 @@ int caller() {
|
||||
// CHECK: attributes #[[sve2]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+v8a"
|
||||
// CHECK: attributes #[[sve2_aes]] = { {{.*}} "target-features"="+aes,+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-aes,+v8a"
|
||||
// CHECK: attributes #[[sve2_bitperm]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-bitperm,+v8a"
|
||||
// CHECK: attributes #[[sve2_sha3]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-sha3,+v8a"
|
||||
// CHECK: attributes #[[sve2_sm4]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sve,+sve2,+sve2-sm4,+v8a"
|
||||
// CHECK: attributes #[[sve2_sha3]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sha2,+sha3,+sve,+sve2,+sve2-sha3,+v8a"
|
||||
// CHECK: attributes #[[sve2_sm4]] = { {{.*}} "target-features"="+fp-armv8,+fullfp16,+neon,+outline-atomics,+sm4,+sve,+sve2,+sve2-sm4,+v8a"
|
||||
// CHECK: attributes #[[wfxt]] = { {{.*}} "target-features"="+fp-armv8,+neon,+outline-atomics,+v8a,+wfxt"
|
||||
|
@ -210,8 +210,8 @@ void applem4() {}
|
||||
// CHECK: attributes #[[ATTR7]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "tune-cpu"="generic" }
|
||||
// CHECK: attributes #[[ATTR8]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="neoverse-n1" "target-features"="+aes,+crc,+dotprod,+fp-armv8,+fullfp16,+lse,+neon,+perfmon,+ras,+rcpc,+rdm,+sha2,+spe,+ssbs,+v8.1a,+v8.2a,+v8a" "tune-cpu"="cortex-a710" }
|
||||
// CHECK: attributes #[[ATTR9]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+fp-armv8,+fullfp16,+sve" "tune-cpu"="cortex-a710" }
|
||||
// CHECK: attributes #[[ATTR10]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="neoverse-v1" "target-features"="+aes,+bf16,+ccdp,+ccidx,+complxnum,+crc,+dit,+dotprod,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+perfmon,+rand,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+spe,+ssbs,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8a" }
|
||||
// CHECK: attributes #[[ATTR11]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="neoverse-v1" "target-features"="+aes,+bf16,+ccdp,+ccidx,+complxnum,+crc,+dit,+dotprod,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+perfmon,+rand,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+spe,+ssbs,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8a,-sve" }
|
||||
// CHECK: attributes #[[ATTR10]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="neoverse-v1" "target-features"="+aes,+bf16,+ccdp,+ccidx,+ccpp,+complxnum,+crc,+dit,+dotprod,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+perfmon,+rand,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+spe,+ssbs,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8a" }
|
||||
// CHECK: attributes #[[ATTR11]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="neoverse-v1" "target-features"="+aes,+bf16,+ccdp,+ccidx,+ccpp,+complxnum,+crc,+dit,+dotprod,+flagm,+fp-armv8,+fp16fml,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+perfmon,+rand,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+spe,+ssbs,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8a,-sve" }
|
||||
// CHECK: attributes #[[ATTR12]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+fp-armv8,+fullfp16,+sve" }
|
||||
// CHECK: attributes #[[ATTR13]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+fp-armv8,+fullfp16" }
|
||||
// CHECK: attributes #[[ATTR14]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="neoverse-n1" "target-features"="+aes,+bf16,+bti,+ccidx,+complxnum,+crc,+dit,+dotprod,+flagm,+fp-armv8,+fullfp16,+i8mm,+jsconv,+lse,+neon,+pauth,+perfmon,+predres,+ras,+rcpc,+rdm,+sb,+sha2,+spe,+ssbs,+sve,+sve2,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8.5a,+v8.6a,+v8a" "tune-cpu"="cortex-a710" }
|
||||
|
@ -248,14 +248,14 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_two._Msimd
|
||||
// CHECK-SAME: () #[[ATTR12]] {
|
||||
// CHECK-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_two._Mfp16Msimd
|
||||
// CHECK-SAME: () #[[ATTR13:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR14:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
@ -288,7 +288,7 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_c._Mssbs
|
||||
// CHECK-SAME: () #[[ATTR14:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR15:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
@ -346,14 +346,14 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@unused_with_forward_default_decl._Mmops
|
||||
// CHECK-SAME: () #[[ATTR16:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR17:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@unused_with_implicit_extern_forward_default_decl._Mdotprod
|
||||
// CHECK-SAME: () #[[ATTR17:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR18:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
@ -367,7 +367,7 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@unused_with_default_def._Msve
|
||||
// CHECK-SAME: () #[[ATTR18:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR19:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
@ -381,7 +381,7 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@unused_with_implicit_default_def._Mfp16
|
||||
// CHECK-SAME: () #[[ATTR13]] {
|
||||
// CHECK-SAME: () #[[ATTR20:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
@ -402,14 +402,14 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@unused_with_implicit_forward_default_def._Mlse
|
||||
// CHECK-SAME: () #[[ATTR19:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR21:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@unused_without_default._Mrdm
|
||||
// CHECK-SAME: () #[[ATTR20:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR22:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
@ -423,14 +423,14 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@used_def_without_default_decl._Mjscvt
|
||||
// CHECK-SAME: () #[[ATTR22:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR24:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@used_def_without_default_decl._Mrdm
|
||||
// CHECK-SAME: () #[[ATTR20]] {
|
||||
// CHECK-SAME: () #[[ATTR22]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
@ -602,7 +602,7 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_d._Msb
|
||||
// CHECK-SAME: () #[[ATTR24:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR26:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 0
|
||||
//
|
||||
@ -644,112 +644,112 @@ int caller(void) { return used_def_without_default_decl() + used_decl_without_de
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MaesMf64mmMsha2
|
||||
// CHECK-SAME: () #[[ATTR25:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR27:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 1
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MfcmaMfp16MrdmMsme
|
||||
// CHECK-SAME: () #[[ATTR26:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR28:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 2
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._Mf32mmMi8mmMsha3
|
||||
// CHECK-SAME: () #[[ATTR27:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR29:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 12
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._Mbf16Mdit
|
||||
// CHECK-SAME: () #[[ATTR28:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR30:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 8
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MdpbMrcpc2
|
||||
// CHECK-SAME: () #[[ATTR29:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR31:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 6
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._Mdpb2Mjscvt
|
||||
// CHECK-SAME: () #[[ATTR30:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR32:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 7
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MfrinttsMrcpc
|
||||
// CHECK-SAME: () #[[ATTR31:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR33:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 3
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._Mbf16Msve
|
||||
// CHECK-SAME: () #[[ATTR32:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR34:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 4
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._Msve2-aesMsve2-sha3
|
||||
// CHECK-SAME: () #[[ATTR33:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR35:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 5
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._Msve2Msve2-aesMsve2-bitperm
|
||||
// CHECK-SAME: () #[[ATTR34:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR36:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 9
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MmemtagMsve2-sm4
|
||||
// CHECK-SAME: () #[[ATTR35:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR37:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 10
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MmemtagMmopsMrcpc3
|
||||
// CHECK-SAME: () #[[ATTR36:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR38:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 11
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MaesMdotprod
|
||||
// CHECK-SAME: () #[[ATTR37:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR39:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 13
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._Mfp16fmlMsimd
|
||||
// CHECK-SAME: () #[[ATTR38:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR40:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 14
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MfpMsm4
|
||||
// CHECK-SAME: () #[[ATTR39:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR41:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 15
|
||||
//
|
||||
//
|
||||
// CHECK: Function Attrs: noinline nounwind optnone
|
||||
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MlseMrdm
|
||||
// CHECK-SAME: () #[[ATTR40:[0-9]+]] {
|
||||
// CHECK-SAME: () #[[ATTR42:[0-9]+]] {
|
||||
// CHECK-NEXT: entry:
|
||||
// CHECK-NEXT: ret i32 16
|
||||
//
|
||||
|
@ -335,7 +335,7 @@
|
||||
// CHECK-MCPU-A57: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" "+fp-armv8" "-target-feature" "+neon" "-target-feature" "+perfmon" "-target-feature" "+sha2"
|
||||
// CHECK-MCPU-A72: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" "+fp-armv8" "-target-feature" "+neon" "-target-feature" "+perfmon" "-target-feature" "+sha2"
|
||||
// CHECK-MCPU-CORTEX-A73: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" "+fp-armv8" "-target-feature" "+neon" "-target-feature" "+perfmon" "-target-feature" "+sha2"
|
||||
// CHECK-MCPU-CORTEX-R82: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8r" "-target-feature" "+ccdp" "-target-feature" "+complxnum" "-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" "+flagm" "-target-feature" "+fp-armv8" "-target-feature" "+fp16fml" "-target-feature" "+fullfp16" "-target-feature" "+jsconv" "-target-feature" "+lse" "-target-feature" "+neon" "-target-feature" "+pauth" "-target-feature" "+perfmon" "-target-feature" "+predres" "-target-feature" "+ras" "-target-feature" "+rcpc" "-target-feature" "+rdm" "-target-feature" "+sb" "-target-feature" "+ssbs"
|
||||
// CHECK-MCPU-CORTEX-R82: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8r" "-target-feature" "+ccdp" "-target-feature" "+ccpp" "-target-feature" "+complxnum" "-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" "+flagm" "-target-feature" "+fp-armv8" "-target-feature" "+fp16fml" "-target-feature" "+fullfp16" "-target-feature" "+jsconv" "-target-feature" "+lse" "-target-feature" "+neon" "-target-feature" "+pauth" "-target-feature" "+perfmon" "-target-feature" "+predres" "-target-feature" "+ras" "-target-feature" "+rcpc" "-target-feature" "+rdm" "-target-feature" "+sb" "-target-feature" "+ssbs"
|
||||
// CHECK-MCPU-M3: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" "+fp-armv8" "-target-feature" "+neon" "-target-feature" "+perfmon" "-target-feature" "+sha2"
|
||||
// CHECK-MCPU-M4: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8.2a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" "+fp-armv8" "-target-feature" "+fullfp16" "-target-feature" "+lse" "-target-feature" "+neon" "-target-feature" "+perfmon" "-target-feature" "+ras" "-target-feature" "+rdm" "-target-feature" "+sha2"
|
||||
// CHECK-MCPU-KRYO: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" "+fp-armv8" "-target-feature" "+neon" "-target-feature" "+perfmon" "-target-feature" "+sha2"
|
||||
@ -344,7 +344,7 @@
|
||||
// CHECK-MCPU-CARMEL: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+v8.2a" "-target-feature" "+aes" "-target-feature" "+crc" "-target-feature" "+fp-armv8" "-target-feature" "+fullfp16" "-target-feature" "+lse" "-target-feature" "+neon" "-target-feature" "+ras" "-target-feature" "+rdm" "-target-feature" "+sha2"
|
||||
|
||||
// RUN: %clang -target x86_64-apple-macosx -arch arm64 -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARCH-ARM64 %s
|
||||
// CHECK-ARCH-ARM64: "-target-cpu" "apple-m1" "-target-feature" "+zcm" "-target-feature" "+zcz" "-target-feature" "+v8.4a" "-target-feature" "+aes" "-target-feature" "+altnzcv" "-target-feature" "+ccdp" "-target-feature" "+complxnum" "-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" "+fp-armv8" "-target-feature" "+fp16fml" "-target-feature" "+fptoint" "-target-feature" "+fullfp16" "-target-feature" "+jsconv" "-target-feature" "+lse" "-target-feature" "+neon" "-target-feature" "+pauth" "-target-feature" "+perfmon" "-target-feature" "+predres" "-target-feature" "+ras" "-target-feature" "+rcpc" "-target-feature" "+rdm" "-target-feature" "+sb" "-target-feature" "+sha2" "-target-feature" "+sha3" "-target-feature" "+specrestrict" "-target-feature" "+ssbs"
|
||||
// CHECK-ARCH-ARM64: "-target-cpu" "apple-m1" "-target-feature" "+zcm" "-target-feature" "+zcz" "-target-feature" "+v8.4a" "-target-feature" "+aes" "-target-feature" "+altnzcv" "-target-feature" "+ccdp" "-target-feature" "+ccpp" "-target-feature" "+complxnum" "-target-feature" "+crc" "-target-feature" "+dotprod" "-target-feature" "+flagm" "-target-feature" "+fp-armv8" "-target-feature" "+fp16fml" "-target-feature" "+fptoint" "-target-feature" "+fullfp16" "-target-feature" "+jsconv" "-target-feature" "+lse" "-target-feature" "+neon" "-target-feature" "+pauth" "-target-feature" "+perfmon" "-target-feature" "+predres" "-target-feature" "+ras" "-target-feature" "+rcpc" "-target-feature" "+rdm" "-target-feature" "+sb" "-target-feature" "+sha2" "-target-feature" "+sha3" "-target-feature" "+specrestrict" "-target-feature" "+ssbs"
|
||||
|
||||
// RUN: %clang -target x86_64-apple-macosx -arch arm64_32 -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARCH-ARM64_32 %s
|
||||
// CHECK-ARCH-ARM64_32: "-target-cpu" "apple-s4" "-target-feature" "+zcm" "-target-feature" "+zcz" "-target-feature" "+v8.3a" "-target-feature" "+aes" "-target-feature" "+complxnum" "-target-feature" "+crc" "-target-feature" "+fp-armv8" "-target-feature" "+fullfp16" "-target-feature" "+jsconv" "-target-feature" "+lse" "-target-feature" "+neon" "-target-feature" "+pauth" "-target-feature" "+perfmon" "-target-feature" "+ras" "-target-feature" "+rcpc" "-target-feature" "+rdm" "-target-feature" "+sha2"
|
||||
|
@ -68,19 +68,13 @@ struct ExtensionInfo {
|
||||
#include "llvm/TargetParser/AArch64TargetParserDef.inc"
|
||||
|
||||
struct FMVInfo {
|
||||
StringRef Name; // The target_version/target_clones spelling.
|
||||
CPUFeatures Bit; // Index of the bit in the FMV feature bitset.
|
||||
StringRef Features; // List of SubtargetFeatures to enable.
|
||||
unsigned Priority; // FMV priority.
|
||||
FMVInfo(StringRef Name, CPUFeatures Bit, StringRef Features,
|
||||
StringRef Name; // The target_version/target_clones spelling.
|
||||
CPUFeatures Bit; // Index of the bit in the FMV feature bitset.
|
||||
std::optional<ArchExtKind> ID; // The architecture extension to enable.
|
||||
unsigned Priority; // FMV priority.
|
||||
FMVInfo(StringRef Name, CPUFeatures Bit, std::optional<ArchExtKind> ID,
|
||||
unsigned Priority)
|
||||
: Name(Name), Bit(Bit), Features(Features), Priority(Priority){};
|
||||
|
||||
SmallVector<StringRef, 8> getImpliedFeatures() {
|
||||
SmallVector<StringRef, 8> Feats;
|
||||
Features.split(Feats, ',', -1, false); // discard empty strings
|
||||
return Feats;
|
||||
}
|
||||
: Name(Name), Bit(Bit), ID(ID), Priority(Priority) {};
|
||||
};
|
||||
|
||||
const std::vector<FMVInfo> &getFMVInfo();
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
|
||||
// Something you can add to target_version or target_clones.
|
||||
class FMVExtension<string n, string b, string f, int p> {
|
||||
class FMVExtension<string n, string b, int p> {
|
||||
// Name, as spelled in target_version or target_clones. e.g. "memtag".
|
||||
string Name = n;
|
||||
|
||||
@ -30,56 +30,56 @@ class FMVExtension<string n, string b, string f, int p> {
|
||||
// Currently this is given as a value from the enum "CPUFeatures".
|
||||
string Bit = b;
|
||||
|
||||
// SubtargetFeatures enabled for codegen when this FMV feature is present.
|
||||
string BackendFeatures = f;
|
||||
// SubtargetFeature enabled for codegen when this FMV feature is present.
|
||||
string BackendFeature = n;
|
||||
|
||||
// The FMV priority.
|
||||
int Priority = p;
|
||||
}
|
||||
|
||||
def : FMVExtension<"aes", "FEAT_PMULL", "+aes,+fp-armv8,+neon", 150>;
|
||||
def : FMVExtension<"bf16", "FEAT_BF16", "+bf16", 280>;
|
||||
def : FMVExtension<"bti", "FEAT_BTI", "+bti", 510>;
|
||||
def : FMVExtension<"crc", "FEAT_CRC", "+crc", 110>;
|
||||
def : FMVExtension<"dit", "FEAT_DIT", "+dit", 180>;
|
||||
def : FMVExtension<"dotprod", "FEAT_DOTPROD", "+dotprod,+fp-armv8,+neon", 104>;
|
||||
def : FMVExtension<"dpb", "FEAT_DPB", "+ccpp", 190>;
|
||||
def : FMVExtension<"dpb2", "FEAT_DPB2", "+ccpp,+ccdp", 200>;
|
||||
def : FMVExtension<"f32mm", "FEAT_SVE_F32MM", "+sve,+f32mm,+fullfp16,+fp-armv8,+neon", 350>;
|
||||
def : FMVExtension<"f64mm", "FEAT_SVE_F64MM", "+sve,+f64mm,+fullfp16,+fp-armv8,+neon", 360>;
|
||||
def : FMVExtension<"fcma", "FEAT_FCMA", "+fp-armv8,+neon,+complxnum", 220>;
|
||||
def : FMVExtension<"flagm", "FEAT_FLAGM", "+flagm", 20>;
|
||||
def : FMVExtension<"flagm2", "FEAT_FLAGM2", "+flagm,+altnzcv", 30>;
|
||||
def : FMVExtension<"fp", "FEAT_FP", "+fp-armv8,+neon", 90>;
|
||||
def : FMVExtension<"fp16", "FEAT_FP16", "+fullfp16,+fp-armv8,+neon", 170>;
|
||||
def : FMVExtension<"fp16fml", "FEAT_FP16FML", "+fp16fml,+fullfp16,+fp-armv8,+neon", 175>;
|
||||
def : FMVExtension<"frintts", "FEAT_FRINTTS", "+fptoint", 250>;
|
||||
def : FMVExtension<"i8mm", "FEAT_I8MM", "+i8mm", 270>;
|
||||
def : FMVExtension<"jscvt", "FEAT_JSCVT", "+fp-armv8,+neon,+jsconv", 210>;
|
||||
def : FMVExtension<"ls64", "FEAT_LS64_ACCDATA", "+ls64", 520>;
|
||||
def : FMVExtension<"lse", "FEAT_LSE", "+lse", 80>;
|
||||
def : FMVExtension<"memtag", "FEAT_MEMTAG2", "+mte", 440>;
|
||||
def : FMVExtension<"mops", "FEAT_MOPS", "+mops", 650>;
|
||||
def : FMVExtension<"predres", "FEAT_PREDRES", "+predres", 480>;
|
||||
def : FMVExtension<"rcpc", "FEAT_RCPC", "+rcpc", 230>;
|
||||
def : FMVExtension<"rcpc2", "FEAT_RCPC2", "+rcpc", 240>;
|
||||
def : FMVExtension<"rcpc3", "FEAT_RCPC3", "+rcpc,+rcpc3", 241>;
|
||||
def : FMVExtension<"rdm", "FEAT_RDM", "+rdm,+fp-armv8,+neon", 108>;
|
||||
def : FMVExtension<"rng", "FEAT_RNG", "+rand", 10>;
|
||||
def : FMVExtension<"sb", "FEAT_SB", "+sb", 470>;
|
||||
def : FMVExtension<"sha2", "FEAT_SHA2", "+sha2,+fp-armv8,+neon", 130>;
|
||||
def : FMVExtension<"sha3", "FEAT_SHA3", "+sha3,+sha2,+fp-armv8,+neon", 140>;
|
||||
def : FMVExtension<"simd", "FEAT_SIMD", "+fp-armv8,+neon", 100>;
|
||||
def : FMVExtension<"sm4", "FEAT_SM4", "+sm4,+fp-armv8,+neon", 106>;
|
||||
def : FMVExtension<"sme", "FEAT_SME", "+sme,+bf16", 430>;
|
||||
def : FMVExtension<"sme-f64f64", "FEAT_SME_F64", "+sme,+sme-f64f64,+bf16", 560>;
|
||||
def : FMVExtension<"sme-i16i64", "FEAT_SME_I64", "+sme,+sme-i16i64,+bf16", 570>;
|
||||
def : FMVExtension<"sme2", "FEAT_SME2", "+sme2,+sme,+bf16", 580>;
|
||||
def : FMVExtension<"ssbs", "FEAT_SSBS2", "+ssbs", 490>;
|
||||
def : FMVExtension<"sve", "FEAT_SVE", "+sve,+fullfp16,+fp-armv8,+neon", 310>;
|
||||
def : FMVExtension<"sve2", "FEAT_SVE2", "+sve2,+sve,+fullfp16,+fp-armv8,+neon", 370>;
|
||||
def : FMVExtension<"sve2-aes", "FEAT_SVE_PMULL128", "+sve2,+sve,+aes,+sve2-aes,+fullfp16,+fp-armv8,+neon", 380>;
|
||||
def : FMVExtension<"sve2-bitperm", "FEAT_SVE_BITPERM", "+sve2,+sve,+sve2-bitperm,+fullfp16,+fp-armv8,+neon", 400>;
|
||||
def : FMVExtension<"sve2-sha3", "FEAT_SVE_SHA3", "+sve2,+sve,+sve2-sha3,+fullfp16,+fp-armv8,+neon", 410>;
|
||||
def : FMVExtension<"sve2-sm4", "FEAT_SVE_SM4", "+sve2,+sve,+sve2-sm4,+fullfp16,+fp-armv8,+neon", 420>;
|
||||
def : FMVExtension<"wfxt", "FEAT_WFXT", "+wfxt", 550>;
|
||||
def : FMVExtension<"aes", "FEAT_PMULL", 150>;
|
||||
def : FMVExtension<"bf16", "FEAT_BF16", 280>;
|
||||
def : FMVExtension<"bti", "FEAT_BTI", 510>;
|
||||
def : FMVExtension<"crc", "FEAT_CRC", 110>;
|
||||
def : FMVExtension<"dit", "FEAT_DIT", 180>;
|
||||
def : FMVExtension<"dotprod", "FEAT_DOTPROD", 104>;
|
||||
let BackendFeature = "ccpp" in def : FMVExtension<"dpb", "FEAT_DPB", 190>;
|
||||
let BackendFeature = "ccdp" in def : FMVExtension<"dpb2", "FEAT_DPB2", 200>;
|
||||
def : FMVExtension<"f32mm", "FEAT_SVE_F32MM", 350>;
|
||||
def : FMVExtension<"f64mm", "FEAT_SVE_F64MM", 360>;
|
||||
def : FMVExtension<"fcma", "FEAT_FCMA", 220>;
|
||||
def : FMVExtension<"flagm", "FEAT_FLAGM", 20>;
|
||||
let BackendFeature = "altnzcv" in def : FMVExtension<"flagm2", "FEAT_FLAGM2", 30>;
|
||||
def : FMVExtension<"fp", "FEAT_FP", 90>;
|
||||
def : FMVExtension<"fp16", "FEAT_FP16", 170>;
|
||||
def : FMVExtension<"fp16fml", "FEAT_FP16FML", 175>;
|
||||
let BackendFeature = "fptoint" in def : FMVExtension<"frintts", "FEAT_FRINTTS", 250>;
|
||||
def : FMVExtension<"i8mm", "FEAT_I8MM", 270>;
|
||||
def : FMVExtension<"jscvt", "FEAT_JSCVT", 210>;
|
||||
def : FMVExtension<"ls64", "FEAT_LS64_ACCDATA", 520>;
|
||||
def : FMVExtension<"lse", "FEAT_LSE", 80>;
|
||||
def : FMVExtension<"memtag", "FEAT_MEMTAG2", 440>;
|
||||
def : FMVExtension<"mops", "FEAT_MOPS", 650>;
|
||||
def : FMVExtension<"predres", "FEAT_PREDRES", 480>;
|
||||
def : FMVExtension<"rcpc", "FEAT_RCPC", 230>;
|
||||
let BackendFeature = "rcpc-immo" in def : FMVExtension<"rcpc2", "FEAT_RCPC2", 240>;
|
||||
def : FMVExtension<"rcpc3", "FEAT_RCPC3", 241>;
|
||||
def : FMVExtension<"rdm", "FEAT_RDM", 108>;
|
||||
def : FMVExtension<"rng", "FEAT_RNG", 10>;
|
||||
def : FMVExtension<"sb", "FEAT_SB", 470>;
|
||||
def : FMVExtension<"sha2", "FEAT_SHA2", 130>;
|
||||
def : FMVExtension<"sha3", "FEAT_SHA3", 140>;
|
||||
def : FMVExtension<"simd", "FEAT_SIMD", 100>;
|
||||
def : FMVExtension<"sm4", "FEAT_SM4", 106>;
|
||||
def : FMVExtension<"sme", "FEAT_SME", 430>;
|
||||
def : FMVExtension<"sme-f64f64", "FEAT_SME_F64", 560>;
|
||||
def : FMVExtension<"sme-i16i64", "FEAT_SME_I64", 570>;
|
||||
def : FMVExtension<"sme2", "FEAT_SME2", 580>;
|
||||
def : FMVExtension<"ssbs", "FEAT_SSBS2", 490>;
|
||||
def : FMVExtension<"sve", "FEAT_SVE", 310>;
|
||||
def : FMVExtension<"sve2", "FEAT_SVE2", 370>;
|
||||
def : FMVExtension<"sve2-aes", "FEAT_SVE_PMULL128", 380>;
|
||||
def : FMVExtension<"sve2-bitperm", "FEAT_SVE_BITPERM", 400>;
|
||||
def : FMVExtension<"sve2-sha3", "FEAT_SVE_SHA3", 410>;
|
||||
def : FMVExtension<"sve2-sm4", "FEAT_SVE_SM4", 420>;
|
||||
def : FMVExtension<"wfxt", "FEAT_WFXT", 550>;
|
||||
|
@ -243,7 +243,7 @@ def FeatureRCPC_IMMO : Extension<"rcpc-immo", "RCPC_IMMO", "FEAT_LRCPC2",
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def FeatureAltFPCmp : Extension<"altnzcv", "AlternativeNZCV", "FEAT_FlagM2",
|
||||
"Enable alternative NZCV format for floating point comparisons">;
|
||||
"Enable alternative NZCV format for floating point comparisons", [FeatureFlagM]>;
|
||||
|
||||
def FeatureFRInt3264 : Extension<"fptoint", "FRInt3264", "FEAT_FRINTTS",
|
||||
"Enable FRInt[32|64][Z|X] instructions that round a floating-point number to "
|
||||
@ -259,7 +259,7 @@ def FeaturePredRes : ExtensionWithMArch<"predres", "PredRes", "FEAT_SPECRES",
|
||||
"Enable Armv8.5-A execution and data prediction invalidation instructions">;
|
||||
|
||||
def FeatureCacheDeepPersist : Extension<"ccdp", "CCDP", "FEAT_DPB2",
|
||||
"Enable Armv8.5-A Cache Clean to Point of Deep Persistence">;
|
||||
"Enable Armv8.5-A Cache Clean to Point of Deep Persistence", [FeatureCCPP]>;
|
||||
|
||||
def FeatureBranchTargetId : ExtensionWithMArch<"bti", "BTI", "FEAT_BTI",
|
||||
"Enable Branch Target Identification">;
|
||||
|
@ -12,6 +12,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/StringSet.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/FormatVariadic.h"
|
||||
@ -78,6 +79,15 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
|
||||
};
|
||||
sort(SortedExtensions, Alphabetical);
|
||||
|
||||
// Cache Extension records for quick lookup.
|
||||
DenseMap<StringRef, const Record *> ExtensionMap;
|
||||
for (const Record *Rec : SortedExtensions) {
|
||||
auto Name = Rec->getValueAsString("UserVisibleName");
|
||||
if (Name.empty())
|
||||
Name = Rec->getValueAsString("Name");
|
||||
ExtensionMap[Name] = Rec;
|
||||
}
|
||||
|
||||
// The ARMProcFamilyEnum values are initialised by SubtargetFeature defs
|
||||
// which set the ARMProcFamily field. We can generate the enum from these defs
|
||||
// which look like this:
|
||||
@ -153,7 +163,12 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
|
||||
OS << " I.emplace_back(";
|
||||
OS << "\"" << Rec->getValueAsString("Name") << "\"";
|
||||
OS << ", " << Rec->getValueAsString("Bit");
|
||||
OS << ", \"" << Rec->getValueAsString("BackendFeatures") << "\"";
|
||||
auto FeatName = Rec->getValueAsString("BackendFeature");
|
||||
const Record *FeatRec = ExtensionMap[FeatName];
|
||||
if (FeatRec)
|
||||
OS << ", " << FeatRec->getValueAsString("ArchExtKindSpelling").upper();
|
||||
else
|
||||
OS << ", std::nullopt";
|
||||
OS << ", " << (uint64_t)Rec->getValueAsInt("Priority");
|
||||
OS << ");\n";
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user