llvm-project/llvm/test/CodeGen/ARM/arm-v8.1m-check-mve-extension.ll
simpal01 74cdb8e6f8
[llvm][ARM] Emit MVE .arch_extension after .fpu directive if it does not include MVE features (#71545)
The floating-point and MVE features together specify the MVE
functionality that is supported on the Cortex-M85 processor. But the FPU
extension for the underlying architecture(armv8.1-m.main) is FPV5 which
does not include MVE-F. So Compiler's -S output and `-save-temps=obj`
loses MVE feature which leads to assembler error. What happening here is
.fpu directive overrides any previously set features by .cpu directive.
Since the the corresponding .fpu generated (.fpu fpv5-d16) does not
include MVE-F, it overrides those features even though it is supported
and set by the .cpu directive. Looks like .fpu is supposed to do this.

In this case, there should be an .arch_extension directive re-enabling
the relevant extensions after .fpu if the goal is to keep these
extensions enabled. GCC also does the same.

So this patch enables the MVE features by emitting the below arch
extension:
  .fpu fpv5-d16
  .arch_extension mve.fp

---------

Co-authored-by: Simi Pallipurath <simi.pallipurath.com>
2023-11-22 09:16:58 +00:00

15 lines
477 B
LLVM

; 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
}