Skip to content

Commit 60cccde

Browse files
committed
AArch64: Add FMINNUM_IEEE and FMAXNUM_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. Add fp-maximumnum-minimumnum.ll, with nnan testcases only. Known problem: V1F64 is not supported yet. If we set v1f64 as legal, FMINNUM/FMAXNUM will have some problem: both of them use if (isOperationLegalOrCustom(FMAXNUM_IEEE, VT)). AArch64 depends on expandFMINNUM_FMAXNUM returning SDValue() for FMAXNUM and FMINNUM. We should fix this problem, while it will be in future patch.
1 parent 641b4d5 commit 60cccde

File tree

6 files changed

+244
-15
lines changed

6 files changed

+244
-15
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,8 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
12871287
case ISD::VP_FMINIMUM:
12881288
case ISD::FMAXIMUM:
12891289
case ISD::VP_FMAXIMUM:
1290+
case ISD::FMINIMUMNUM:
1291+
case ISD::FMAXIMUMNUM:
12901292
case ISD::SDIV: case ISD::VP_SDIV:
12911293
case ISD::UDIV: case ISD::VP_UDIV:
12921294
case ISD::FDIV: case ISD::VP_FDIV:

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -860,12 +860,14 @@ 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+
// clang-format off
863864
for (auto Op :
864865
{ISD::FFLOOR, ISD::FNEARBYINT, ISD::FCEIL,
865866
ISD::FRINT, ISD::FTRUNC, ISD::FROUND,
866867
ISD::FROUNDEVEN, ISD::FMINNUM, ISD::FMAXNUM,
867868
ISD::FMINIMUM, ISD::FMAXIMUM, ISD::LROUND,
868869
ISD::LLROUND, ISD::LRINT, ISD::LLRINT,
870+
ISD::FMINNUM_IEEE, ISD::FMAXNUM_IEEE,
869871
ISD::STRICT_FFLOOR, ISD::STRICT_FCEIL, ISD::STRICT_FNEARBYINT,
870872
ISD::STRICT_FRINT, ISD::STRICT_FTRUNC, ISD::STRICT_FROUNDEVEN,
871873
ISD::STRICT_FROUND, ISD::STRICT_FMINNUM, ISD::STRICT_FMAXNUM,
@@ -876,6 +878,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
876878
if (Subtarget->hasFullFP16())
877879
setOperationAction(Op, MVT::f16, Legal);
878880
}
881+
// clang-format on
879882

880883
// Basic strict FP operations are legal
881884
for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
@@ -1193,6 +1196,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
11931196
ISD::FEXP10, ISD::FRINT, ISD::FROUND,
11941197
ISD::FROUNDEVEN, ISD::FTRUNC, ISD::FMINNUM,
11951198
ISD::FMAXNUM, ISD::FMINIMUM, ISD::FMAXIMUM,
1199+
ISD::FMAXNUM_IEEE, ISD::FMINNUM_IEEE,
11961200
ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
11971201
ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FCEIL,
11981202
ISD::STRICT_FFLOOR, ISD::STRICT_FSQRT, ISD::STRICT_FRINT,
@@ -1201,6 +1205,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
12011205
ISD::STRICT_FMINIMUM, ISD::STRICT_FMAXIMUM})
12021206
setOperationAction(Op, MVT::v1f64, Expand);
12031207
// clang-format on
1208+
12041209
for (auto Op :
12051210
{ISD::FP_TO_SINT, ISD::FP_TO_UINT, ISD::SINT_TO_FP, ISD::UINT_TO_FP,
12061211
ISD::FP_ROUND, ISD::FP_TO_SINT_SAT, ISD::FP_TO_UINT_SAT, ISD::MUL,
@@ -1344,12 +1349,12 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
13441349
}
13451350
}
13461351

1347-
// AArch64 has implementations of a lot of rounding-like FP operations.
13481352
for (auto Op :
13491353
{ISD::FFLOOR, ISD::FNEARBYINT, ISD::FCEIL, ISD::FRINT, ISD::FTRUNC,
1350-
ISD::FROUND, ISD::FROUNDEVEN, ISD::STRICT_FFLOOR,
1351-
ISD::STRICT_FNEARBYINT, ISD::STRICT_FCEIL, ISD::STRICT_FRINT,
1352-
ISD::STRICT_FTRUNC, ISD::STRICT_FROUND, ISD::STRICT_FROUNDEVEN}) {
1354+
ISD::FROUND, ISD::FROUNDEVEN, ISD::FMAXNUM_IEEE, ISD::FMINNUM_IEEE,
1355+
ISD::STRICT_FFLOOR, ISD::STRICT_FNEARBYINT, ISD::STRICT_FCEIL,
1356+
ISD::STRICT_FRINT, ISD::STRICT_FTRUNC, ISD::STRICT_FROUND,
1357+
ISD::STRICT_FROUNDEVEN}) {
13531358
for (MVT Ty : {MVT::v2f32, MVT::v4f32, MVT::v2f64})
13541359
setOperationAction(Op, Ty, Legal);
13551360
if (Subtarget->hasFullFP16())
@@ -1930,10 +1935,10 @@ void AArch64TargetLowering::addTypeForNEON(MVT VT) {
19301935
(VT.getVectorElementType() != MVT::f16 || Subtarget->hasFullFP16()))
19311936
for (unsigned Opcode :
19321937
{ISD::FMINIMUM, ISD::FMAXIMUM, ISD::FMINNUM, ISD::FMAXNUM,
1933-
ISD::STRICT_FMINIMUM, ISD::STRICT_FMAXIMUM, ISD::STRICT_FMINNUM,
1934-
ISD::STRICT_FMAXNUM, ISD::STRICT_FADD, ISD::STRICT_FSUB,
1935-
ISD::STRICT_FMUL, ISD::STRICT_FDIV, ISD::STRICT_FMA,
1936-
ISD::STRICT_FSQRT})
1938+
ISD::FMINNUM_IEEE, ISD::FMAXNUM_IEEE, ISD::STRICT_FMINIMUM,
1939+
ISD::STRICT_FMAXIMUM, ISD::STRICT_FMINNUM, ISD::STRICT_FMAXNUM,
1940+
ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
1941+
ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT})
19371942
setOperationAction(Opcode, VT, Legal);
19381943

19391944
// Strict fp extend and trunc are legal

llvm/lib/Target/AArch64/AArch64ISelLowering.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,7 @@ class AArch64TargetLowering : public TargetLowering {
12031203
SDValue LowerBitreverse(SDValue Op, SelectionDAG &DAG) const;
12041204
SDValue LowerMinMax(SDValue Op, SelectionDAG &DAG) const;
12051205
SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
1206+
SDValue LowerFMINIMUMNUM_FMAXIMUMNUM(SDValue Op, SelectionDAG &DAG) const;
12061207
SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
12071208
SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
12081209
SDValue LowerVectorFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;

llvm/lib/Target/AArch64/AArch64InstrInfo.td

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

5053+
def : Pat<(fminnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
5054+
(FMINNMDrr FPR64:$a, FPR64:$b)>;
5055+
def : Pat<(fminnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
5056+
(FMINNMSrr FPR32:$a, FPR32:$b)>;
5057+
def : Pat<(fminnum_ieee (f16 FPR16:$a), (f16 FPR16:$b)),
5058+
(FMINNMHrr FPR16:$a, FPR16:$b)>;
5059+
def : Pat<(fmaxnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
5060+
(FMAXNMDrr FPR64:$a, FPR64:$b)>;
5061+
def : Pat<(fmaxnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
5062+
(FMAXNMSrr FPR32:$a, FPR32:$b)>;
5063+
def : Pat<(fmaxnum_ieee (f16 FPR16:$a), (f16 FPR16:$b)),
5064+
(FMAXNMHrr FPR16:$a, FPR16:$b)>;
5065+
50535066
//===----------------------------------------------------------------------===//
50545067
// Floating point three operand instructions.
50555068
//===----------------------------------------------------------------------===//
@@ -5554,6 +5567,27 @@ defm FMINNM : SIMDThreeSameVectorFP<0,1,0b000,"fminnm", any_fminnum>;
55545567
defm FMINP : SIMDThreeSameVectorFP<1,1,0b110,"fminp", int_aarch64_neon_fminp>;
55555568
defm FMIN : SIMDThreeSameVectorFP<0,1,0b110,"fmin", any_fminimum>;
55565569

5570+
def : Pat<(v2f64 (fminnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
5571+
(v2f64 (FMINNMv2f64 (v2f64 V128:$Rn), (v2f64 V128:$Rm)))>;
5572+
def : Pat<(v4f32 (fminnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
5573+
(v4f32 (FMINNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rm)))>;
5574+
def : Pat<(v8f16 (fminnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5575+
(v8f16 (FMINNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rm)))>;
5576+
def : Pat<(v2f32 (fminnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
5577+
(v2f32 (FMINNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rm)))>;
5578+
def : Pat<(v4f16 (fminnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5579+
(v4f16 (FMINNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5580+
def : Pat<(v2f64 (fmaxnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
5581+
(v2f64 (FMAXNMv2f64 (v2f64 V128:$Rn), (v2f64 V128:$Rm)))>;
5582+
def : Pat<(v4f32 (fmaxnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
5583+
(v4f32 (FMAXNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rm)))>;
5584+
def : Pat<(v8f16 (fmaxnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5585+
(v8f16 (FMAXNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rm)))>;
5586+
def : Pat<(v2f32 (fmaxnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
5587+
(v2f32 (FMAXNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rm)))>;
5588+
def : Pat<(v4f16 (fmaxnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5589+
(v4f16 (FMAXNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5590+
55575591
// NOTE: The operands of the PatFrag are reordered on FMLA/FMLS because the
55585592
// instruction expects the addend first, while the fma intrinsic puts it last.
55595593
defm FMLA : SIMDThreeSameVectorFPTied<0, 0, 0b001, "fmla",

llvm/test/CodeGen/AArch64/combine_andor_with_cmps.ll

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,15 @@ define i1 @test2(double %arg1, double %arg2, double %arg3) #0 {
3131
ret i1 %or1
3232
}
3333

34-
; It is illegal to apply the optimization in the following two test cases
35-
; because FMINNUM_IEEE and FMAXNUM_IEEE are not supported.
36-
3734
define i1 @test3(float %arg1, float %arg2, float %arg3) {
3835
; CHECK-LABEL: test3:
3936
; CHECK: // %bb.0:
4037
; CHECK-NEXT: fmov s3, #1.00000000
4138
; CHECK-NEXT: fadd s0, s0, s3
4239
; CHECK-NEXT: fmov s3, #2.00000000
4340
; CHECK-NEXT: fadd s1, s1, s3
44-
; CHECK-NEXT: fcmp s1, s2
45-
; CHECK-NEXT: fccmp s0, s2, #0, lt
41+
; CHECK-NEXT: fmaxnm s0, s0, s1
42+
; CHECK-NEXT: fcmp s0, s2
4643
; CHECK-NEXT: cset w0, lt
4744
; CHECK-NEXT: ret
4845
%add1 = fadd nnan float %arg1, 1.0
@@ -60,8 +57,8 @@ define i1 @test4(float %arg1, float %arg2, float %arg3) {
6057
; CHECK-NEXT: fadd s0, s0, s3
6158
; CHECK-NEXT: fmov s3, #2.00000000
6259
; CHECK-NEXT: fadd s1, s1, s3
63-
; CHECK-NEXT: fcmp s1, s2
64-
; CHECK-NEXT: fccmp s0, s2, #4, gt
60+
; CHECK-NEXT: fminnm s0, s0, s1
61+
; CHECK-NEXT: fcmp s0, s2
6562
; CHECK-NEXT: cset w0, gt
6663
; CHECK-NEXT: ret
6764
%add1 = fadd nnan float %arg1, 1.0
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc --mtriple=aarch64 --mattr=+fullfp16 < %s | FileCheck %s --check-prefix=AARCH64
3+
4+
define <2 x double> @max_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
5+
; AARCH64-LABEL: max_nnan_v2f64:
6+
; AARCH64: // %bb.0: // %entry
7+
; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v1.2d
8+
; AARCH64-NEXT: ret
9+
entry:
10+
%c = call nnan <2 x double> @llvm.maximumnum.v2f64(<2 x double> %a, <2 x double> %b)
11+
ret <2 x double> %c
12+
}
13+
14+
define <4 x float> @max_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
15+
; AARCH64-LABEL: max_nnan_v4f32:
16+
; AARCH64: // %bb.0: // %entry
17+
; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v1.4s
18+
; AARCH64-NEXT: ret
19+
entry:
20+
%c = call nnan <4 x float> @llvm.maximumnum.v4f32(<4 x float> %a, <4 x float> %b)
21+
ret <4 x float> %c
22+
}
23+
24+
define <8 x half> @max_nnan_v8f16(<8 x half> %a, <8 x half> %b) {
25+
; AARCH64-LABEL: max_nnan_v8f16:
26+
; AARCH64: // %bb.0: // %entry
27+
; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v1.8h
28+
; AARCH64-NEXT: ret
29+
entry:
30+
%c = call nnan <8 x half> @llvm.maximumnum.v8f16(<8 x half> %a, <8 x half> %b)
31+
ret <8 x half> %c
32+
}
33+
34+
define <4 x double> @max_nnan_v4f64(<4 x double> %a, <4 x double> %b) {
35+
; AARCH64-LABEL: max_nnan_v4f64:
36+
; AARCH64: // %bb.0: // %entry
37+
; AARCH64-NEXT: fmaxnm v1.2d, v1.2d, v3.2d
38+
; AARCH64-NEXT: fmaxnm v0.2d, v0.2d, v2.2d
39+
; AARCH64-NEXT: ret
40+
entry:
41+
%c = call nnan <4 x double> @llvm.maximumnum.v4f64(<4 x double> %a, <4 x double> %b)
42+
ret <4 x double> %c
43+
}
44+
45+
define <8 x float> @max_nnan_v8f32(<8 x float> %a, <8 x float> %b) {
46+
; AARCH64-LABEL: max_nnan_v8f32:
47+
; AARCH64: // %bb.0: // %entry
48+
; AARCH64-NEXT: fmaxnm v1.4s, v1.4s, v3.4s
49+
; AARCH64-NEXT: fmaxnm v0.4s, v0.4s, v2.4s
50+
; AARCH64-NEXT: ret
51+
entry:
52+
%c = call nnan <8 x float> @llvm.maximumnum.v8f32(<8 x float> %a, <8 x float> %b)
53+
ret <8 x float> %c
54+
}
55+
56+
define <16 x half> @max_nnan_v16f16(<16 x half> %a, <16 x half> %b) {
57+
; AARCH64-LABEL: max_nnan_v16f16:
58+
; AARCH64: // %bb.0: // %entry
59+
; AARCH64-NEXT: fmaxnm v1.8h, v1.8h, v3.8h
60+
; AARCH64-NEXT: fmaxnm v0.8h, v0.8h, v2.8h
61+
; AARCH64-NEXT: ret
62+
entry:
63+
%c = call nnan <16 x half> @llvm.maximumnum.v16f16(<16 x half> %a, <16 x half> %b)
64+
ret <16 x half> %c
65+
}
66+
67+
68+
define double @max_nnan_f64(double %a, double %b) {
69+
; AARCH64-LABEL: max_nnan_f64:
70+
; AARCH64: // %bb.0: // %entry
71+
; AARCH64-NEXT: fmaxnm d0, d0, d1
72+
; AARCH64-NEXT: ret
73+
entry:
74+
%c = call nnan double @llvm.maximumnum.f64(double %a, double %b)
75+
ret double %c
76+
}
77+
78+
define float @max_nnan_f32(float %a, float %b) {
79+
; AARCH64-LABEL: max_nnan_f32:
80+
; AARCH64: // %bb.0: // %entry
81+
; AARCH64-NEXT: fmaxnm s0, s0, s1
82+
; AARCH64-NEXT: ret
83+
entry:
84+
%c = call nnan float @llvm.maximumnum.f32(float %a, float %b)
85+
ret float %c
86+
}
87+
88+
define half @max_nnan_f16(half %a, half %b) {
89+
; AARCH64-LABEL: max_nnan_f16:
90+
; AARCH64: // %bb.0: // %entry
91+
; AARCH64-NEXT: fmaxnm h0, h0, h1
92+
; AARCH64-NEXT: ret
93+
entry:
94+
%c = call nnan half @llvm.maximumnum.f16(half %a, half %b)
95+
ret half %c
96+
}
97+
98+
define <2 x double> @min_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
99+
; AARCH64-LABEL: min_nnan_v2f64:
100+
; AARCH64: // %bb.0: // %entry
101+
; AARCH64-NEXT: fminnm v0.2d, v0.2d, v1.2d
102+
; AARCH64-NEXT: ret
103+
entry:
104+
%c = call nnan <2 x double> @llvm.minimumnum.v2f64(<2 x double> %a, <2 x double> %b)
105+
ret <2 x double> %c
106+
}
107+
108+
define <4 x float> @min_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
109+
; AARCH64-LABEL: min_nnan_v4f32:
110+
; AARCH64: // %bb.0: // %entry
111+
; AARCH64-NEXT: fminnm v0.4s, v0.4s, v1.4s
112+
; AARCH64-NEXT: ret
113+
entry:
114+
%c = call nnan <4 x float> @llvm.minimumnum.v4f32(<4 x float> %a, <4 x float> %b)
115+
ret <4 x float> %c
116+
}
117+
118+
define <8 x half> @min_nnan_v8f16(<8 x half> %a, <8 x half> %b) {
119+
; AARCH64-LABEL: min_nnan_v8f16:
120+
; AARCH64: // %bb.0: // %entry
121+
; AARCH64-NEXT: fminnm v0.8h, v0.8h, v1.8h
122+
; AARCH64-NEXT: ret
123+
entry:
124+
%c = call nnan <8 x half> @llvm.minimumnum.v8f16(<8 x half> %a, <8 x half> %b)
125+
ret <8 x half> %c
126+
}
127+
128+
define <4 x double> @min_nnan_v4f64(<4 x double> %a, <4 x double> %b) {
129+
; AARCH64-LABEL: min_nnan_v4f64:
130+
; AARCH64: // %bb.0: // %entry
131+
; AARCH64-NEXT: fminnm v1.2d, v1.2d, v3.2d
132+
; AARCH64-NEXT: fminnm v0.2d, v0.2d, v2.2d
133+
; AARCH64-NEXT: ret
134+
entry:
135+
%c = call nnan <4 x double> @llvm.minimumnum.v4f64(<4 x double> %a, <4 x double> %b)
136+
ret <4 x double> %c
137+
}
138+
139+
define <8 x float> @min_nnan_v8f32(<8 x float> %a, <8 x float> %b) {
140+
; AARCH64-LABEL: min_nnan_v8f32:
141+
; AARCH64: // %bb.0: // %entry
142+
; AARCH64-NEXT: fminnm v1.4s, v1.4s, v3.4s
143+
; AARCH64-NEXT: fminnm v0.4s, v0.4s, v2.4s
144+
; AARCH64-NEXT: ret
145+
entry:
146+
%c = call nnan <8 x float> @llvm.minimumnum.v8f32(<8 x float> %a, <8 x float> %b)
147+
ret <8 x float> %c
148+
}
149+
150+
define <16 x half> @min_nnan_v16f16(<16 x half> %a, <16 x half> %b) {
151+
; AARCH64-LABEL: min_nnan_v16f16:
152+
; AARCH64: // %bb.0: // %entry
153+
; AARCH64-NEXT: fminnm v1.8h, v1.8h, v3.8h
154+
; AARCH64-NEXT: fminnm v0.8h, v0.8h, v2.8h
155+
; AARCH64-NEXT: ret
156+
entry:
157+
%c = call nnan <16 x half> @llvm.minimumnum.v16f16(<16 x half> %a, <16 x half> %b)
158+
ret <16 x half> %c
159+
}
160+
161+
define double @min_nnan_f64(double %a, double %b) {
162+
; AARCH64-LABEL: min_nnan_f64:
163+
; AARCH64: // %bb.0: // %entry
164+
; AARCH64-NEXT: fminnm d0, d0, d1
165+
; AARCH64-NEXT: ret
166+
entry:
167+
%c = call nnan double @llvm.minimumnum.f64(double %a, double %b)
168+
ret double %c
169+
}
170+
171+
define float @min_nnan_f32(float %a, float %b) {
172+
; AARCH64-LABEL: min_nnan_f32:
173+
; AARCH64: // %bb.0: // %entry
174+
; AARCH64-NEXT: fminnm s0, s0, s1
175+
; AARCH64-NEXT: ret
176+
entry:
177+
%c = call nnan float @llvm.minimumnum.f32(float %a, float %b)
178+
ret float %c
179+
}
180+
181+
define half @min_nnan_f16(half %a, half %b) {
182+
; AARCH64-LABEL: min_nnan_f16:
183+
; AARCH64: // %bb.0: // %entry
184+
; AARCH64-NEXT: fminnm h0, h0, h1
185+
; AARCH64-NEXT: ret
186+
entry:
187+
%c = call nnan half @llvm.minimumnum.f16(half %a, half %b)
188+
ret half %c
189+
}
190+

0 commit comments

Comments
 (0)