Skip to content

Commit 32938ff

Browse files
authored
[LoongArch] Make fminnum/fmaxnum legal for lsx/lasx (#162768)
1 parent f725f84 commit 32938ff

File tree

5 files changed

+40
-156
lines changed

5 files changed

+40
-156
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
375375
setOperationAction(ISD::FFLOOR, VT, Legal);
376376
setOperationAction(ISD::FTRUNC, VT, Legal);
377377
setOperationAction(ISD::FROUNDEVEN, VT, Legal);
378+
setOperationAction(ISD::FMINNUM, VT, Legal);
379+
setOperationAction(ISD::FMAXNUM, VT, Legal);
378380
}
379381
setOperationAction(ISD::CTPOP, GRLenVT, Legal);
380382
setOperationAction(ISD::FCEIL, {MVT::f32, MVT::f64}, Legal);
@@ -461,6 +463,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
461463
setOperationAction(ISD::FFLOOR, VT, Legal);
462464
setOperationAction(ISD::FTRUNC, VT, Legal);
463465
setOperationAction(ISD::FROUNDEVEN, VT, Legal);
466+
setOperationAction(ISD::FMINNUM, VT, Legal);
467+
setOperationAction(ISD::FMAXNUM, VT, Legal);
464468
}
465469
}
466470

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,6 +1558,10 @@ defm : PatXrXrF<fmul, "XVFMUL">;
15581558
// XVFDIV_{S/D}
15591559
defm : PatXrXrF<fdiv, "XVFDIV">;
15601560

1561+
// XVFMAX_{S/D}, XVFMIN_{S/D}
1562+
defm : PatXrXrF<fmaxnum, "XVFMAX">;
1563+
defm : PatXrXrF<fminnum, "XVFMIN">;
1564+
15611565
// XVFMADD_{S/D}
15621566
def : Pat<(fma v8f32:$xj, v8f32:$xk, v8f32:$xa),
15631567
(XVFMADD_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>;

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,6 +1760,10 @@ defm : PatVrVrF<fmul, "VFMUL">;
17601760
// VFDIV_{S/D}
17611761
defm : PatVrVrF<fdiv, "VFDIV">;
17621762

1763+
// VFMAX_{S/D}, VFMIN_{S/D}
1764+
defm : PatVrVrF<fmaxnum, "VFMAX">;
1765+
defm : PatVrVrF<fminnum, "VFMIN">;
1766+
17631767
// VFMADD_{S/D}
17641768
def : Pat<(fma v4f32:$vj, v4f32:$vk, v4f32:$va),
17651769
(VFMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;

llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll

Lines changed: 14 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,10 @@
55
define void @minnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {
66
; CHECK-LABEL: minnum_v8f32:
77
; CHECK: # %bb.0: # %entry
8-
; CHECK-NEXT: xvld $xr0, $a2, 0
9-
; CHECK-NEXT: xvld $xr1, $a1, 0
10-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 5
11-
; CHECK-NEXT: xvpickve.w $xr3, $xr1, 5
12-
; CHECK-NEXT: fmin.s $fa2, $fa3, $fa2
13-
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 4
14-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 4
15-
; CHECK-NEXT: fmin.s $fa3, $fa4, $fa3
16-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
17-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 6
18-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 6
19-
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
20-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
21-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 7
22-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 7
23-
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
24-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 48
25-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 1
26-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 1
27-
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
28-
; CHECK-NEXT: xvpickve.w $xr4, $xr0, 0
29-
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 0
30-
; CHECK-NEXT: fmin.s $fa4, $fa5, $fa4
31-
; CHECK-NEXT: vextrins.w $vr4, $vr2, 16
32-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 2
33-
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 2
34-
; CHECK-NEXT: fmin.s $fa2, $fa5, $fa2
35-
; CHECK-NEXT: vextrins.w $vr4, $vr2, 32
36-
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
37-
; CHECK-NEXT: xvpickve.w $xr1, $xr1, 3
38-
; CHECK-NEXT: fmin.s $fa0, $fa1, $fa0
39-
; CHECK-NEXT: vextrins.w $vr4, $vr0, 48
40-
; CHECK-NEXT: xvpermi.q $xr4, $xr3, 2
41-
; CHECK-NEXT: xvst $xr4, $a0, 0
8+
; CHECK-NEXT: xvld $xr0, $a1, 0
9+
; CHECK-NEXT: xvld $xr1, $a2, 0
10+
; CHECK-NEXT: xvfmin.s $xr0, $xr0, $xr1
11+
; CHECK-NEXT: xvst $xr0, $a0, 0
4212
; CHECK-NEXT: ret
4313
entry:
4414
%v0 = load <8 x float>, ptr %x
@@ -51,23 +21,9 @@ entry:
5121
define void @minnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {
5222
; CHECK-LABEL: minnum_v4f64:
5323
; CHECK: # %bb.0: # %entry
54-
; CHECK-NEXT: xvld $xr0, $a2, 0
55-
; CHECK-NEXT: xvld $xr1, $a1, 0
56-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 3
57-
; CHECK-NEXT: xvpickve.d $xr3, $xr1, 3
58-
; CHECK-NEXT: fmin.d $fa2, $fa3, $fa2
59-
; CHECK-NEXT: xvpickve.d $xr3, $xr0, 2
60-
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 2
61-
; CHECK-NEXT: fmin.d $fa3, $fa4, $fa3
62-
; CHECK-NEXT: vextrins.d $vr3, $vr2, 16
63-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 1
64-
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 1
65-
; CHECK-NEXT: fmin.d $fa2, $fa4, $fa2
66-
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
67-
; CHECK-NEXT: xvpickve.d $xr1, $xr1, 0
68-
; CHECK-NEXT: fmin.d $fa0, $fa1, $fa0
69-
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
70-
; CHECK-NEXT: xvpermi.q $xr0, $xr3, 2
24+
; CHECK-NEXT: xvld $xr0, $a1, 0
25+
; CHECK-NEXT: xvld $xr1, $a2, 0
26+
; CHECK-NEXT: xvfmin.d $xr0, $xr0, $xr1
7127
; CHECK-NEXT: xvst $xr0, $a0, 0
7228
; CHECK-NEXT: ret
7329
entry:
@@ -81,40 +37,10 @@ entry:
8137
define void @maxnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {
8238
; CHECK-LABEL: maxnum_v8f32:
8339
; CHECK: # %bb.0: # %entry
84-
; CHECK-NEXT: xvld $xr0, $a2, 0
85-
; CHECK-NEXT: xvld $xr1, $a1, 0
86-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 5
87-
; CHECK-NEXT: xvpickve.w $xr3, $xr1, 5
88-
; CHECK-NEXT: fmax.s $fa2, $fa3, $fa2
89-
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 4
90-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 4
91-
; CHECK-NEXT: fmax.s $fa3, $fa4, $fa3
92-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
93-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 6
94-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 6
95-
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
96-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
97-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 7
98-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 7
99-
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
100-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 48
101-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 1
102-
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 1
103-
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
104-
; CHECK-NEXT: xvpickve.w $xr4, $xr0, 0
105-
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 0
106-
; CHECK-NEXT: fmax.s $fa4, $fa5, $fa4
107-
; CHECK-NEXT: vextrins.w $vr4, $vr2, 16
108-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 2
109-
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 2
110-
; CHECK-NEXT: fmax.s $fa2, $fa5, $fa2
111-
; CHECK-NEXT: vextrins.w $vr4, $vr2, 32
112-
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
113-
; CHECK-NEXT: xvpickve.w $xr1, $xr1, 3
114-
; CHECK-NEXT: fmax.s $fa0, $fa1, $fa0
115-
; CHECK-NEXT: vextrins.w $vr4, $vr0, 48
116-
; CHECK-NEXT: xvpermi.q $xr4, $xr3, 2
117-
; CHECK-NEXT: xvst $xr4, $a0, 0
40+
; CHECK-NEXT: xvld $xr0, $a1, 0
41+
; CHECK-NEXT: xvld $xr1, $a2, 0
42+
; CHECK-NEXT: xvfmax.s $xr0, $xr0, $xr1
43+
; CHECK-NEXT: xvst $xr0, $a0, 0
11844
; CHECK-NEXT: ret
11945
entry:
12046
%v0 = load <8 x float>, ptr %x
@@ -127,23 +53,9 @@ entry:
12753
define void @maxnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {
12854
; CHECK-LABEL: maxnum_v4f64:
12955
; CHECK: # %bb.0: # %entry
130-
; CHECK-NEXT: xvld $xr0, $a2, 0
131-
; CHECK-NEXT: xvld $xr1, $a1, 0
132-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 3
133-
; CHECK-NEXT: xvpickve.d $xr3, $xr1, 3
134-
; CHECK-NEXT: fmax.d $fa2, $fa3, $fa2
135-
; CHECK-NEXT: xvpickve.d $xr3, $xr0, 2
136-
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 2
137-
; CHECK-NEXT: fmax.d $fa3, $fa4, $fa3
138-
; CHECK-NEXT: vextrins.d $vr3, $vr2, 16
139-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 1
140-
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 1
141-
; CHECK-NEXT: fmax.d $fa2, $fa4, $fa2
142-
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
143-
; CHECK-NEXT: xvpickve.d $xr1, $xr1, 0
144-
; CHECK-NEXT: fmax.d $fa0, $fa1, $fa0
145-
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
146-
; CHECK-NEXT: xvpermi.q $xr0, $xr3, 2
56+
; CHECK-NEXT: xvld $xr0, $a1, 0
57+
; CHECK-NEXT: xvld $xr1, $a2, 0
58+
; CHECK-NEXT: xvfmax.d $xr0, $xr0, $xr1
14759
; CHECK-NEXT: xvst $xr0, $a0, 0
14860
; CHECK-NEXT: ret
14961
entry:

llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,10 @@
55
define void @minnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {
66
; CHECK-LABEL: minnum_v4f32:
77
; CHECK: # %bb.0: # %entry
8-
; CHECK-NEXT: vld $vr0, $a2, 0
9-
; CHECK-NEXT: vld $vr1, $a1, 0
10-
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 1
11-
; CHECK-NEXT: vreplvei.w $vr3, $vr1, 1
12-
; CHECK-NEXT: fmin.s $fa2, $fa3, $fa2
13-
; CHECK-NEXT: vreplvei.w $vr3, $vr0, 0
14-
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 0
15-
; CHECK-NEXT: fmin.s $fa3, $fa4, $fa3
16-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
17-
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 2
18-
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 2
19-
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
20-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
21-
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 3
22-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 3
23-
; CHECK-NEXT: fmin.s $fa0, $fa1, $fa0
24-
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
25-
; CHECK-NEXT: vst $vr3, $a0, 0
8+
; CHECK-NEXT: vld $vr0, $a1, 0
9+
; CHECK-NEXT: vld $vr1, $a2, 0
10+
; CHECK-NEXT: vfmin.s $vr0, $vr0, $vr1
11+
; CHECK-NEXT: vst $vr0, $a0, 0
2612
; CHECK-NEXT: ret
2713
entry:
2814
%v0 = load <4 x float>, ptr %x
@@ -35,15 +21,9 @@ entry:
3521
define void @minnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {
3622
; CHECK-LABEL: minnum_v2f64:
3723
; CHECK: # %bb.0: # %entry
38-
; CHECK-NEXT: vld $vr0, $a2, 0
39-
; CHECK-NEXT: vld $vr1, $a1, 0
40-
; CHECK-NEXT: vreplvei.d $vr2, $vr0, 1
41-
; CHECK-NEXT: vreplvei.d $vr3, $vr1, 1
42-
; CHECK-NEXT: fmin.d $fa2, $fa3, $fa2
43-
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
44-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
45-
; CHECK-NEXT: fmin.d $fa0, $fa1, $fa0
46-
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
24+
; CHECK-NEXT: vld $vr0, $a1, 0
25+
; CHECK-NEXT: vld $vr1, $a2, 0
26+
; CHECK-NEXT: vfmin.d $vr0, $vr0, $vr1
4727
; CHECK-NEXT: vst $vr0, $a0, 0
4828
; CHECK-NEXT: ret
4929
entry:
@@ -57,24 +37,10 @@ entry:
5737
define void @maxnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {
5838
; CHECK-LABEL: maxnum_v4f32:
5939
; CHECK: # %bb.0: # %entry
60-
; CHECK-NEXT: vld $vr0, $a2, 0
61-
; CHECK-NEXT: vld $vr1, $a1, 0
62-
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 1
63-
; CHECK-NEXT: vreplvei.w $vr3, $vr1, 1
64-
; CHECK-NEXT: fmax.s $fa2, $fa3, $fa2
65-
; CHECK-NEXT: vreplvei.w $vr3, $vr0, 0
66-
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 0
67-
; CHECK-NEXT: fmax.s $fa3, $fa4, $fa3
68-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
69-
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 2
70-
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 2
71-
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
72-
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
73-
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 3
74-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 3
75-
; CHECK-NEXT: fmax.s $fa0, $fa1, $fa0
76-
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
77-
; CHECK-NEXT: vst $vr3, $a0, 0
40+
; CHECK-NEXT: vld $vr0, $a1, 0
41+
; CHECK-NEXT: vld $vr1, $a2, 0
42+
; CHECK-NEXT: vfmax.s $vr0, $vr0, $vr1
43+
; CHECK-NEXT: vst $vr0, $a0, 0
7844
; CHECK-NEXT: ret
7945
entry:
8046
%v0 = load <4 x float>, ptr %x
@@ -87,15 +53,9 @@ entry:
8753
define void @maxnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {
8854
; CHECK-LABEL: maxnum_v2f64:
8955
; CHECK: # %bb.0: # %entry
90-
; CHECK-NEXT: vld $vr0, $a2, 0
91-
; CHECK-NEXT: vld $vr1, $a1, 0
92-
; CHECK-NEXT: vreplvei.d $vr2, $vr0, 1
93-
; CHECK-NEXT: vreplvei.d $vr3, $vr1, 1
94-
; CHECK-NEXT: fmax.d $fa2, $fa3, $fa2
95-
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
96-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
97-
; CHECK-NEXT: fmax.d $fa0, $fa1, $fa0
98-
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
56+
; CHECK-NEXT: vld $vr0, $a1, 0
57+
; CHECK-NEXT: vld $vr1, $a2, 0
58+
; CHECK-NEXT: vfmax.d $vr0, $vr0, $vr1
9959
; CHECK-NEXT: vst $vr0, $a0, 0
10060
; CHECK-NEXT: ret
10161
entry:

0 commit comments

Comments
 (0)