Skip to content

Commit 492cc9b

Browse files
ylzsxgithub-actions[bot]
authored andcommitted
Automerge: [LoongArch] Make ceil,floor,trunc,roundeven legal for lsx/lasx (#165217)
2 parents ba2f37e + cc27143 commit 492cc9b

File tree

5 files changed

+35
-272
lines changed

5 files changed

+35
-272
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
371371
ISD::SETUGE, ISD::SETUGT},
372372
VT, Expand);
373373
setOperationAction(ISD::SCALAR_TO_VECTOR, VT, Legal);
374+
setOperationAction(ISD::FCEIL, VT, Legal);
375+
setOperationAction(ISD::FFLOOR, VT, Legal);
376+
setOperationAction(ISD::FTRUNC, VT, Legal);
377+
setOperationAction(ISD::FROUNDEVEN, VT, Legal);
374378
}
375379
setOperationAction(ISD::CTPOP, GRLenVT, Legal);
376380
setOperationAction(ISD::FCEIL, {MVT::f32, MVT::f64}, Legal);
@@ -453,6 +457,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
453457
ISD::SETUGE, ISD::SETUGT},
454458
VT, Expand);
455459
setOperationAction(ISD::SCALAR_TO_VECTOR, VT, Legal);
460+
setOperationAction(ISD::FCEIL, VT, Legal);
461+
setOperationAction(ISD::FFLOOR, VT, Legal);
462+
setOperationAction(ISD::FTRUNC, VT, Legal);
463+
setOperationAction(ISD::FROUNDEVEN, VT, Legal);
456464
}
457465
}
458466

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,6 +2424,12 @@ def : Pat<(int_loongarch_lasx_xvpickve_w_f v8f32:$xj, timm:$imm),
24242424
def : Pat<(int_loongarch_lasx_xvpickve_d_f v4f64:$xj, timm:$imm),
24252425
(XVPICKVE_D v4f64:$xj, (to_valid_timm timm:$imm))>;
24262426

2427+
// Vector floating-point conversion
2428+
defm : PatXrF<fceil, "XVFRINTRP">;
2429+
defm : PatXrF<ffloor, "XVFRINTRM">;
2430+
defm : PatXrF<ftrunc, "XVFRINTRZ">;
2431+
defm : PatXrF<froundeven, "XVFRINTRNE">;
2432+
24272433
// load
24282434
def : Pat<(int_loongarch_lasx_xvld GPR:$rj, timm:$imm),
24292435
(XVLD GPR:$rj, (to_valid_timm timm:$imm))>;

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2552,6 +2552,11 @@ def : Pat<(f64 (froundeven FPR64:$fj)),
25522552
(f64 (EXTRACT_SUBREG (VFRINTRNE_D (VREPLVEI_D
25532553
(SUBREG_TO_REG (i64 0), FPR64:$fj, sub_64), 0)), sub_64))>;
25542554

2555+
defm : PatVrF<fceil, "VFRINTRP">;
2556+
defm : PatVrF<ffloor, "VFRINTRM">;
2557+
defm : PatVrF<ftrunc, "VFRINTRZ">;
2558+
defm : PatVrF<froundeven, "VFRINTRNE">;
2559+
25552560
// load
25562561
def : Pat<(int_loongarch_lsx_vld GPR:$rj, timm:$imm),
25572562
(VLD GPR:$rj, (to_valid_timm timm:$imm))>;

llvm/test/CodeGen/LoongArch/lasx/fp-rounding.ll

Lines changed: 12 additions & 188 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,8 @@ define void @ceil_v8f32(ptr %res, ptr %a0) nounwind {
77
; CHECK-LABEL: ceil_v8f32:
88
; CHECK: # %bb.0: # %entry
99
; CHECK-NEXT: xvld $xr0, $a1, 0
10-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 5
11-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
12-
; CHECK-NEXT: vfrintrp.s $vr1, $vr1
13-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 4
14-
; CHECK-NEXT: vreplvei.w $vr2, $vr2, 0
15-
; CHECK-NEXT: vfrintrp.s $vr2, $vr2
16-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 16
17-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 6
18-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
19-
; CHECK-NEXT: vfrintrp.s $vr1, $vr1
20-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 32
21-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 7
22-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
23-
; CHECK-NEXT: vfrintrp.s $vr1, $vr1
24-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 48
25-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 1
26-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
27-
; CHECK-NEXT: vfrintrp.s $vr1, $vr1
28-
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 0
29-
; CHECK-NEXT: vreplvei.w $vr3, $vr3, 0
30-
; CHECK-NEXT: vfrintrp.s $vr3, $vr3
31-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 16
32-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 2
33-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
34-
; CHECK-NEXT: vfrintrp.s $vr1, $vr1
35-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 32
36-
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
37-
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 0
38-
; CHECK-NEXT: vfrintrp.s $vr0, $vr0
39-
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
40-
; CHECK-NEXT: xvpermi.q $xr3, $xr2, 2
41-
; CHECK-NEXT: xvst $xr3, $a0, 0
10+
; CHECK-NEXT: xvfrintrp.s $xr0, $xr0
11+
; CHECK-NEXT: xvst $xr0, $a0, 0
4212
; CHECK-NEXT: ret
4313
entry:
4414
%v0 = load <8 x float>, ptr %a0
@@ -52,21 +22,7 @@ define void @ceil_v4f64(ptr %res, ptr %a0) nounwind {
5222
; CHECK-LABEL: ceil_v4f64:
5323
; CHECK: # %bb.0: # %entry
5424
; CHECK-NEXT: xvld $xr0, $a1, 0
55-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 3
56-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
57-
; CHECK-NEXT: vfrintrp.d $vr1, $vr1
58-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 2
59-
; CHECK-NEXT: vreplvei.d $vr2, $vr2, 0
60-
; CHECK-NEXT: vfrintrp.d $vr2, $vr2
61-
; CHECK-NEXT: vextrins.d $vr2, $vr1, 16
62-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 1
63-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
64-
; CHECK-NEXT: vfrintrp.d $vr1, $vr1
65-
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
66-
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
67-
; CHECK-NEXT: vfrintrp.d $vr0, $vr0
68-
; CHECK-NEXT: vextrins.d $vr0, $vr1, 16
69-
; CHECK-NEXT: xvpermi.q $xr0, $xr2, 2
25+
; CHECK-NEXT: xvfrintrp.d $xr0, $xr0
7026
; CHECK-NEXT: xvst $xr0, $a0, 0
7127
; CHECK-NEXT: ret
7228
entry:
@@ -81,38 +37,8 @@ define void @floor_v8f32(ptr %res, ptr %a0) nounwind {
8137
; CHECK-LABEL: floor_v8f32:
8238
; CHECK: # %bb.0: # %entry
8339
; CHECK-NEXT: xvld $xr0, $a1, 0
84-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 5
85-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
86-
; CHECK-NEXT: vfrintrm.s $vr1, $vr1
87-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 4
88-
; CHECK-NEXT: vreplvei.w $vr2, $vr2, 0
89-
; CHECK-NEXT: vfrintrm.s $vr2, $vr2
90-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 16
91-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 6
92-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
93-
; CHECK-NEXT: vfrintrm.s $vr1, $vr1
94-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 32
95-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 7
96-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
97-
; CHECK-NEXT: vfrintrm.s $vr1, $vr1
98-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 48
99-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 1
100-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
101-
; CHECK-NEXT: vfrintrm.s $vr1, $vr1
102-
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 0
103-
; CHECK-NEXT: vreplvei.w $vr3, $vr3, 0
104-
; CHECK-NEXT: vfrintrm.s $vr3, $vr3
105-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 16
106-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 2
107-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
108-
; CHECK-NEXT: vfrintrm.s $vr1, $vr1
109-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 32
110-
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
111-
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 0
112-
; CHECK-NEXT: vfrintrm.s $vr0, $vr0
113-
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
114-
; CHECK-NEXT: xvpermi.q $xr3, $xr2, 2
115-
; CHECK-NEXT: xvst $xr3, $a0, 0
40+
; CHECK-NEXT: xvfrintrm.s $xr0, $xr0
41+
; CHECK-NEXT: xvst $xr0, $a0, 0
11642
; CHECK-NEXT: ret
11743
entry:
11844
%v0 = load <8 x float>, ptr %a0
@@ -126,21 +52,7 @@ define void @floor_v4f64(ptr %res, ptr %a0) nounwind {
12652
; CHECK-LABEL: floor_v4f64:
12753
; CHECK: # %bb.0: # %entry
12854
; CHECK-NEXT: xvld $xr0, $a1, 0
129-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 3
130-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
131-
; CHECK-NEXT: vfrintrm.d $vr1, $vr1
132-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 2
133-
; CHECK-NEXT: vreplvei.d $vr2, $vr2, 0
134-
; CHECK-NEXT: vfrintrm.d $vr2, $vr2
135-
; CHECK-NEXT: vextrins.d $vr2, $vr1, 16
136-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 1
137-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
138-
; CHECK-NEXT: vfrintrm.d $vr1, $vr1
139-
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
140-
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
141-
; CHECK-NEXT: vfrintrm.d $vr0, $vr0
142-
; CHECK-NEXT: vextrins.d $vr0, $vr1, 16
143-
; CHECK-NEXT: xvpermi.q $xr0, $xr2, 2
55+
; CHECK-NEXT: xvfrintrm.d $xr0, $xr0
14456
; CHECK-NEXT: xvst $xr0, $a0, 0
14557
; CHECK-NEXT: ret
14658
entry:
@@ -155,38 +67,8 @@ define void @trunc_v8f32(ptr %res, ptr %a0) nounwind {
15567
; CHECK-LABEL: trunc_v8f32:
15668
; CHECK: # %bb.0: # %entry
15769
; CHECK-NEXT: xvld $xr0, $a1, 0
158-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 5
159-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
160-
; CHECK-NEXT: vfrintrz.s $vr1, $vr1
161-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 4
162-
; CHECK-NEXT: vreplvei.w $vr2, $vr2, 0
163-
; CHECK-NEXT: vfrintrz.s $vr2, $vr2
164-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 16
165-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 6
166-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
167-
; CHECK-NEXT: vfrintrz.s $vr1, $vr1
168-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 32
169-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 7
170-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
171-
; CHECK-NEXT: vfrintrz.s $vr1, $vr1
172-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 48
173-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 1
174-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
175-
; CHECK-NEXT: vfrintrz.s $vr1, $vr1
176-
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 0
177-
; CHECK-NEXT: vreplvei.w $vr3, $vr3, 0
178-
; CHECK-NEXT: vfrintrz.s $vr3, $vr3
179-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 16
180-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 2
181-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
182-
; CHECK-NEXT: vfrintrz.s $vr1, $vr1
183-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 32
184-
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
185-
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 0
186-
; CHECK-NEXT: vfrintrz.s $vr0, $vr0
187-
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
188-
; CHECK-NEXT: xvpermi.q $xr3, $xr2, 2
189-
; CHECK-NEXT: xvst $xr3, $a0, 0
70+
; CHECK-NEXT: xvfrintrz.s $xr0, $xr0
71+
; CHECK-NEXT: xvst $xr0, $a0, 0
19072
; CHECK-NEXT: ret
19173
entry:
19274
%v0 = load <8 x float>, ptr %a0
@@ -200,21 +82,7 @@ define void @trunc_v4f64(ptr %res, ptr %a0) nounwind {
20082
; CHECK-LABEL: trunc_v4f64:
20183
; CHECK: # %bb.0: # %entry
20284
; CHECK-NEXT: xvld $xr0, $a1, 0
203-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 3
204-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
205-
; CHECK-NEXT: vfrintrz.d $vr1, $vr1
206-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 2
207-
; CHECK-NEXT: vreplvei.d $vr2, $vr2, 0
208-
; CHECK-NEXT: vfrintrz.d $vr2, $vr2
209-
; CHECK-NEXT: vextrins.d $vr2, $vr1, 16
210-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 1
211-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
212-
; CHECK-NEXT: vfrintrz.d $vr1, $vr1
213-
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
214-
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
215-
; CHECK-NEXT: vfrintrz.d $vr0, $vr0
216-
; CHECK-NEXT: vextrins.d $vr0, $vr1, 16
217-
; CHECK-NEXT: xvpermi.q $xr0, $xr2, 2
85+
; CHECK-NEXT: xvfrintrz.d $xr0, $xr0
21886
; CHECK-NEXT: xvst $xr0, $a0, 0
21987
; CHECK-NEXT: ret
22088
entry:
@@ -229,38 +97,8 @@ define void @roundeven_v8f32(ptr %res, ptr %a0) nounwind {
22997
; CHECK-LABEL: roundeven_v8f32:
23098
; CHECK: # %bb.0: # %entry
23199
; CHECK-NEXT: xvld $xr0, $a1, 0
232-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 5
233-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
234-
; CHECK-NEXT: vfrintrne.s $vr1, $vr1
235-
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 4
236-
; CHECK-NEXT: vreplvei.w $vr2, $vr2, 0
237-
; CHECK-NEXT: vfrintrne.s $vr2, $vr2
238-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 16
239-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 6
240-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
241-
; CHECK-NEXT: vfrintrne.s $vr1, $vr1
242-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 32
243-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 7
244-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
245-
; CHECK-NEXT: vfrintrne.s $vr1, $vr1
246-
; CHECK-NEXT: vextrins.w $vr2, $vr1, 48
247-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 1
248-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
249-
; CHECK-NEXT: vfrintrne.s $vr1, $vr1
250-
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 0
251-
; CHECK-NEXT: vreplvei.w $vr3, $vr3, 0
252-
; CHECK-NEXT: vfrintrne.s $vr3, $vr3
253-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 16
254-
; CHECK-NEXT: xvpickve.w $xr1, $xr0, 2
255-
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 0
256-
; CHECK-NEXT: vfrintrne.s $vr1, $vr1
257-
; CHECK-NEXT: vextrins.w $vr3, $vr1, 32
258-
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
259-
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 0
260-
; CHECK-NEXT: vfrintrne.s $vr0, $vr0
261-
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
262-
; CHECK-NEXT: xvpermi.q $xr3, $xr2, 2
263-
; CHECK-NEXT: xvst $xr3, $a0, 0
100+
; CHECK-NEXT: xvfrintrne.s $xr0, $xr0
101+
; CHECK-NEXT: xvst $xr0, $a0, 0
264102
; CHECK-NEXT: ret
265103
entry:
266104
%v0 = load <8 x float>, ptr %a0
@@ -274,21 +112,7 @@ define void @roundeven_v4f64(ptr %res, ptr %a0) nounwind {
274112
; CHECK-LABEL: roundeven_v4f64:
275113
; CHECK: # %bb.0: # %entry
276114
; CHECK-NEXT: xvld $xr0, $a1, 0
277-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 3
278-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
279-
; CHECK-NEXT: vfrintrne.d $vr1, $vr1
280-
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 2
281-
; CHECK-NEXT: vreplvei.d $vr2, $vr2, 0
282-
; CHECK-NEXT: vfrintrne.d $vr2, $vr2
283-
; CHECK-NEXT: vextrins.d $vr2, $vr1, 16
284-
; CHECK-NEXT: xvpickve.d $xr1, $xr0, 1
285-
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
286-
; CHECK-NEXT: vfrintrne.d $vr1, $vr1
287-
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
288-
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
289-
; CHECK-NEXT: vfrintrne.d $vr0, $vr0
290-
; CHECK-NEXT: vextrins.d $vr0, $vr1, 16
291-
; CHECK-NEXT: xvpermi.q $xr0, $xr2, 2
115+
; CHECK-NEXT: xvfrintrne.d $xr0, $xr0
292116
; CHECK-NEXT: xvst $xr0, $a0, 0
293117
; CHECK-NEXT: ret
294118
entry:

0 commit comments

Comments
 (0)