[llvm] [GlobalISel][ARM] Legalize reset_fpmode (PR #115859)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 12 04:00:59 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-arm
@llvm/pr-subscribers-llvm-globalisel
Author: Serge Pavlov (spavloff)
<details>
<summary>Changes</summary>
Implement lowering intrinsic `reset_fpmode` in Global Selector for ARM target.
---
Full diff: https://github.com/llvm/llvm-project/pull/115859.diff
2 Files Affected:
- (modified) llvm/lib/Target/ARM/ARMLegalizerInfo.cpp (+13)
- (modified) llvm/test/CodeGen/ARM/GlobalISel/fpenv.ll (+17)
``````````diff
diff --git a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
index 452e908fdad98f..e65ea24c0d23ec 100644
--- a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
+++ b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
@@ -163,6 +163,7 @@ ARMLegalizerInfo::ARMLegalizerInfo(const ARMSubtarget &ST) : ST(ST) {
.legalFor({s32});
getActionDefinitionsBuilder(G_RESET_FPENV).alwaysLegal();
getActionDefinitionsBuilder(G_SET_FPMODE).customFor({s32});
+ getActionDefinitionsBuilder(G_RESET_FPMODE).custom();
} else {
getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV})
.libcallFor({s32, s64});
@@ -467,6 +468,18 @@ bool ARMLegalizerInfo::legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
MIRBuilder.buildSetFPEnv(NewFPSCR);
break;
}
+ case G_RESET_FPMODE: {
+ // To get the default FP mode all control bits are cleared:
+ // FPSCR = FPSCR & (FPStatusBits | FPReservedBits)
+ LLT FPEnvTy = LLT::scalar(32);
+ auto FPEnv = MRI.createGenericVirtualRegister(FPEnvTy);
+ MIRBuilder.buildInstr(G_GET_FPENV).addDef({FPEnv});
+ auto NotModeBitMask = MIRBuilder.buildConstant(
+ FPEnvTy, ARM::FPStatusBits | ARM::FPReservedBits);
+ auto NewFPSCR = MIRBuilder.buildAnd(FPEnvTy, FPEnv, NotModeBitMask);
+ MIRBuilder.buildInstr(G_SET_FPENV).addUse(NewFPSCR.getReg(0));
+ break;
+ }
}
MI.eraseFromParent();
diff --git a/llvm/test/CodeGen/ARM/GlobalISel/fpenv.ll b/llvm/test/CodeGen/ARM/GlobalISel/fpenv.ll
index f8dba64e7a01a9..5aa97dafd94334 100644
--- a/llvm/test/CodeGen/ARM/GlobalISel/fpenv.ll
+++ b/llvm/test/CodeGen/ARM/GlobalISel/fpenv.ll
@@ -165,5 +165,22 @@ entry:
ret void
}
+define void @reset_fpmode() nounwind {
+; CHECK-LABEL: reset_fpmode:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: vmrs r0, fpscr
+; CHECK-NEXT: ldr r1, .LCPI11_0
+; CHECK-NEXT: and r0, r0, r1
+; CHECK-NEXT: vmsr fpscr, r0
+; CHECK-NEXT: mov pc, lr
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: @ %bb.1:
+; CHECK-NEXT: .LCPI11_0:
+; CHECK-NEXT: .long 4160774399 @ 0xf80060ff
+entry:
+ call void @llvm.reset.fpmode()
+ ret void
+}
+
attributes #0 = { nounwind "use-soft-float"="true" }
``````````
</details>
https://github.com/llvm/llvm-project/pull/115859
More information about the llvm-commits
mailing list