Skip to content

Commit 3340528

Browse files
committed
AArch64: Add FCANONICALIZE and FMINNUM_IEEE support
FMINNM/FMAXNM instructions of AArch64 follow IEEE754-2008. We can use them to canonicalize a floating point number. And FMINNUM_IEEE/FMAXNUM_IEEE is used by something like expanding FMINIMUMNUM/FMAXIMUMNUM, so let's define them. update combine_andor_with_cmps.ll
1 parent fb9e685 commit 3340528

File tree

3 files changed

+48
-15
lines changed

3 files changed

+48
-15
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -860,17 +860,38 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
860860
setOperationAction(ISD::FP_ROUND, MVT::v4bf16, Custom);
861861

862862
// AArch64 has implementations of a lot of rounding-like FP operations.
863-
for (auto Op :
864-
{ISD::FFLOOR, ISD::FNEARBYINT, ISD::FCEIL,
865-
ISD::FRINT, ISD::FTRUNC, ISD::FROUND,
866-
ISD::FROUNDEVEN, ISD::FMINNUM, ISD::FMAXNUM,
867-
ISD::FMINIMUM, ISD::FMAXIMUM, ISD::LROUND,
868-
ISD::LLROUND, ISD::LRINT, ISD::LLRINT,
869-
ISD::STRICT_FFLOOR, ISD::STRICT_FCEIL, ISD::STRICT_FNEARBYINT,
870-
ISD::STRICT_FRINT, ISD::STRICT_FTRUNC, ISD::STRICT_FROUNDEVEN,
871-
ISD::STRICT_FROUND, ISD::STRICT_FMINNUM, ISD::STRICT_FMAXNUM,
872-
ISD::STRICT_FMINIMUM, ISD::STRICT_FMAXIMUM, ISD::STRICT_LROUND,
873-
ISD::STRICT_LLROUND, ISD::STRICT_LRINT, ISD::STRICT_LLRINT}) {
863+
for (auto Op : {ISD::FFLOOR,
864+
ISD::FNEARBYINT,
865+
ISD::FCEIL,
866+
ISD::FRINT,
867+
ISD::FTRUNC,
868+
ISD::FROUND,
869+
ISD::FROUNDEVEN,
870+
ISD::FMINNUM,
871+
ISD::FMAXNUM,
872+
ISD::FMINNUM_IEEE,
873+
ISD::FMAXNUM_IEEE,
874+
ISD::FMINIMUM,
875+
ISD::FMAXIMUM,
876+
ISD::LROUND,
877+
ISD::LLROUND,
878+
ISD::LRINT,
879+
ISD::LLRINT,
880+
ISD::STRICT_FFLOOR,
881+
ISD::STRICT_FCEIL,
882+
ISD::STRICT_FNEARBYINT,
883+
ISD::STRICT_FRINT,
884+
ISD::STRICT_FTRUNC,
885+
ISD::STRICT_FROUNDEVEN,
886+
ISD::STRICT_FROUND,
887+
ISD::STRICT_FMINNUM,
888+
ISD::STRICT_FMAXNUM,
889+
ISD::STRICT_FMINIMUM,
890+
ISD::STRICT_FMAXIMUM,
891+
ISD::STRICT_LROUND,
892+
ISD::STRICT_LLROUND,
893+
ISD::STRICT_LRINT,
894+
ISD::STRICT_LLRINT}) {
874895
for (MVT Ty : {MVT::f32, MVT::f64})
875896
setOperationAction(Op, Ty, Legal);
876897
if (Subtarget->hasFullFP16())

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5051,6 +5051,18 @@ def : Pat<(v1f64 (fmaxnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
50515051
def : Pat<(v1f64 (fminnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
50525052
(FMINNMDrr FPR64:$Rn, FPR64:$Rm)>;
50535053

5054+
def : Pat<(fminnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
5055+
(FMINNMDrr FPR64:$a, FPR64:$b)>;
5056+
def : Pat<(fminnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
5057+
(FMINNMSrr FPR32:$a, FPR32:$b)>;
5058+
def : Pat<(fmaxnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
5059+
(FMAXNMDrr FPR64:$a, FPR64:$b)>;
5060+
def : Pat<(fmaxnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
5061+
(FMAXNMSrr FPR32:$a, FPR32:$b)>;
5062+
def : Pat<(f32 (fcanonicalize f32:$a)),
5063+
(FMINNMSrr f32:$a, f32:$a)>;
5064+
def : Pat<(f64 (fcanonicalize f64:$a)),
5065+
(FMINNMDrr f64:$a, f64:$a)>;
50545066
//===----------------------------------------------------------------------===//
50555067
// Floating point three operand instructions.
50565068
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/AArch64/combine_andor_with_cmps.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ define i1 @test3(float %arg1, float %arg2, float %arg3) {
4141
; CHECK-NEXT: fadd s0, s0, s3
4242
; CHECK-NEXT: fmov s3, #2.00000000
4343
; CHECK-NEXT: fadd s1, s1, s3
44-
; CHECK-NEXT: fcmp s1, s2
45-
; CHECK-NEXT: fccmp s0, s2, #0, lt
44+
; CHECK-NEXT: fmaxnm s0, s0, s1
45+
; CHECK-NEXT: fcmp s0, s2
4646
; CHECK-NEXT: cset w0, lt
4747
; CHECK-NEXT: ret
4848
%add1 = fadd nnan float %arg1, 1.0
@@ -60,8 +60,8 @@ define i1 @test4(float %arg1, float %arg2, float %arg3) {
6060
; CHECK-NEXT: fadd s0, s0, s3
6161
; CHECK-NEXT: fmov s3, #2.00000000
6262
; CHECK-NEXT: fadd s1, s1, s3
63-
; CHECK-NEXT: fcmp s1, s2
64-
; CHECK-NEXT: fccmp s0, s2, #4, gt
63+
; CHECK-NEXT: fminnm s0, s0, s1
64+
; CHECK-NEXT: fcmp s0, s2
6565
; CHECK-NEXT: cset w0, gt
6666
; CHECK-NEXT: ret
6767
%add1 = fadd nnan float %arg1, 1.0

0 commit comments

Comments
 (0)