diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 373d5b59bca66..20b52ebc544a1 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -12648,6 +12648,9 @@ bool ARMAsmParser::enableArchExtFeature(StringRef Name, SMLoc &ExtLoc) { {ARM::AEK_CRYPTO, {Feature_HasV8Bit}, {ARM::FeatureCrypto, ARM::FeatureNEON, ARM::FeatureFPARMv8}}, + {(ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP), + {Feature_HasV8_1MMainlineBit}, + {ARM::HasMVEFloatOps}}, {ARM::AEK_FP, {Feature_HasV8Bit}, {ARM::FeatureVFP2_SP, ARM::FeatureFPARMv8}}, diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp index b65d1b24e63d3..e84b597e4382e 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp @@ -238,14 +238,18 @@ void ARMTargetStreamer::emitTargetAttributes(const MCSubtargetInfo &STI) { ? ARMBuildAttrs::AllowNeonARMv8_1a : ARMBuildAttrs::AllowNeonARMv8); } else { - if (STI.hasFeature(ARM::FeatureFPARMv8_D16_SP)) + if (STI.hasFeature(ARM::FeatureFPARMv8_D16_SP)) { // FPv5 and FP-ARMv8 have the same instructions, so are modeled as one // FPU, but there are two different names for it depending on the CPU. - emitFPU(STI.hasFeature(ARM::FeatureD32) - ? ARM::FK_FP_ARMV8 - : (STI.hasFeature(ARM::FeatureFP64) ? ARM::FK_FPV5_D16 - : ARM::FK_FPV5_SP_D16)); - else if (STI.hasFeature(ARM::FeatureVFP4_D16_SP)) + if (STI.hasFeature(ARM::FeatureD32)) + emitFPU(ARM::FK_FP_ARMV8); + else { + emitFPU(STI.hasFeature(ARM::FeatureFP64) ? ARM::FK_FPV5_D16 + : ARM::FK_FPV5_SP_D16); + if (STI.hasFeature(ARM::HasMVEFloatOps)) + emitArchExtension(ARM::AEK_SIMD | ARM::AEK_DSP | ARM::AEK_FP); + } + } else if (STI.hasFeature(ARM::FeatureVFP4_D16_SP)) emitFPU(STI.hasFeature(ARM::FeatureD32) ? ARM::FK_VFPV4 : (STI.hasFeature(ARM::FeatureFP64) ? ARM::FK_VFPV4_D16 diff --git a/llvm/test/CodeGen/ARM/arm-v8.1m-check-mve-extension.ll b/llvm/test/CodeGen/ARM/arm-v8.1m-check-mve-extension.ll new file mode 100644 index 0000000000000..7e12a6b607cb6 --- /dev/null +++ b/llvm/test/CodeGen/ARM/arm-v8.1m-check-mve-extension.ll @@ -0,0 +1,14 @@ +; RUN: llc -mtriple=arm-none-eabi -mcpu=cortex-m85 --float-abi=hard %s -o - | FileCheck %s +; RUN: llc -mtriple=arm-none-eabi -mcpu=cortex-m55 --float-abi=hard %s -o - | FileCheck %s + +; CHECK: .fpu fpv5-d16 +; CHECK-NEXT: .arch_extension mve.fp + +define <4 x float> @vsubf32(<4 x float> %A, <4 x float> %B) { +; CHECK-LABEL: vsubf32: +; CHECK: @ %bb.0: +; CHECK-NEXT: vsub.f32 q0, q0, q1 +; CHECK-NEXT: bx lr + %tmp3 = fsub <4 x float> %A, %B + ret <4 x float> %tmp3 +} diff --git a/llvm/test/MC/ARM/arm-v8.1m-check-mve-extension.s b/llvm/test/MC/ARM/arm-v8.1m-check-mve-extension.s new file mode 100644 index 0000000000000..641e79d8ae2a1 --- /dev/null +++ b/llvm/test/MC/ARM/arm-v8.1m-check-mve-extension.s @@ -0,0 +1,6 @@ +// RUN: llvm-mc -triple thumbv8.1m.main-none-eabi -filetype asm -o - %s 2>&1 | FileCheck %s + +.arch_extension mve.fp +vsub.f32 q0, q0, q1 +// CHECK: vsub.f32 q0, q0, q1 +