Skip to content

Commit d508f0c

Browse files
authored
[AArch64] Fix FPMR handling when switching streaming mode (llvm#135827)
According to the [documentation](https://developer.arm.com/documentation/ddi0601/latest/AArch64-Registers/FPMR--Floating-point-Mode-Register), the FPMR register is set to 0 when entering or exiting streaming mode. This patch models that behavior by adding FPMR as an implicit def to the instructions used for entering and exiting streaming mode.
1 parent 3d7e56f commit d508f0c

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8882,12 +8882,15 @@ void AArch64TargetLowering::AdjustInstrPostInstrSelection(MachineInstr &MI,
88828882
MI.removeOperand(I);
88838883

88848884
// The SVE vector length can change when entering/leaving streaming mode.
8885+
// FPMR is set to 0 when entering/leaving streaming mode.
88858886
if (MI.getOperand(0).getImm() == AArch64SVCR::SVCRSM ||
88868887
MI.getOperand(0).getImm() == AArch64SVCR::SVCRSMZA) {
88878888
MI.addOperand(MachineOperand::CreateReg(AArch64::VG, /*IsDef=*/false,
88888889
/*IsImplicit=*/true));
88898890
MI.addOperand(MachineOperand::CreateReg(AArch64::VG, /*IsDef=*/true,
88908891
/*IsImplicit=*/true));
8892+
MI.addOperand(MachineOperand::CreateReg(AArch64::FPMR, /*IsDef=*/true,
8893+
/*IsImplicit=*/true));
88918894
}
88928895
}
88938896

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
; RUN: llc -mattr=+sme -stop-after=finalize-isel < %s | FileCheck %s
2+
3+
target triple = "aarch64"
4+
5+
; Check that we don't define FPMR for 'smstart za' and 'smstop za'
6+
define void @smstart_za() "aarch64_new_za" nounwind {
7+
; CHECK-LABEL: name: smstart_za
8+
; CHECK-NOT: implicit-def {{[^,]*}}$fpmr
9+
ret void
10+
}
11+
12+
; Check that we do define FPMR for 'smstart sm' and 'smstop sm'
13+
define void @smstart_sm() nounwind {
14+
; CHECK-LABEL: name: smstart_sm
15+
; CHECK: MSRpstatesvcrImm1 1, 1,
16+
; CHECK-SAME: implicit-def {{[^,]*}}$fpmr
17+
; CHECK: MSRpstatesvcrImm1 1, 0,
18+
; CHECK-SAME: implicit-def {{[^,]*}}$fpmr
19+
call void @require_sm()
20+
ret void
21+
}
22+
23+
declare void @require_sm() "aarch64_pstate_sm_enabled"

0 commit comments

Comments
 (0)