Skip to content

Commit 7c00954

Browse files
committed
[LoongArch] Set avg{floor/ceil}{s/u} as legal for lsx and lasx
Suggested-by: tangaac <tangyan01@loongson.cn> Link: #161079 (comment)
1 parent 2fac5a9 commit 7c00954

File tree

5 files changed

+48
-128
lines changed

5 files changed

+48
-128
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
351351
setOperationAction(ISD::SSUBSAT, VT, Legal);
352352
setOperationAction(ISD::UADDSAT, VT, Legal);
353353
setOperationAction(ISD::USUBSAT, VT, Legal);
354+
setOperationAction(ISD::AVGFLOORS, VT, Legal);
355+
setOperationAction(ISD::AVGFLOORU, VT, Legal);
356+
setOperationAction(ISD::AVGCEILS, VT, Legal);
357+
setOperationAction(ISD::AVGCEILU, VT, Legal);
354358
}
355359
for (MVT VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32})
356360
setOperationAction(ISD::BITREVERSE, VT, Custom);
@@ -433,6 +437,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
433437
setOperationAction(ISD::UADDSAT, VT, Legal);
434438
setOperationAction(ISD::USUBSAT, VT, Legal);
435439
setOperationAction(ISD::VECREDUCE_ADD, VT, Custom);
440+
setOperationAction(ISD::AVGFLOORS, VT, Legal);
441+
setOperationAction(ISD::AVGFLOORU, VT, Legal);
442+
setOperationAction(ISD::AVGCEILS, VT, Legal);
443+
setOperationAction(ISD::AVGCEILU, VT, Legal);
436444
}
437445
for (MVT VT : {MVT::v32i8, MVT::v16i16, MVT::v8i32})
438446
setOperationAction(ISD::BITREVERSE, VT, Custom);

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2044,6 +2044,10 @@ defm : VAvgrPat<srl, "XVAVGR_BU", v32i8>;
20442044
defm : VAvgrPat<srl, "XVAVGR_HU", v16i16>;
20452045
defm : VAvgrPat<srl, "XVAVGR_WU", v8i32>;
20462046
defm : VAvgrPat<srl, "XVAVGR_DU", v4i64>;
2047+
defm : PatXrXr<avgfloors, "XVAVG">;
2048+
defm : PatXrXr<avgceils, "XVAVGR">;
2049+
defm : PatXrXrU<avgflooru, "XVAVG">;
2050+
defm : PatXrXrU<avgceilu, "XVAVGR">;
20472051

20482052
// abs
20492053
def : Pat<(abs v32i8:$xj), (XVSIGNCOV_B v32i8:$xj, v32i8:$xj)>;

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2186,6 +2186,10 @@ defm : VAvgrPat<srl, "VAVGR_BU", v16i8>;
21862186
defm : VAvgrPat<srl, "VAVGR_HU", v8i16>;
21872187
defm : VAvgrPat<srl, "VAVGR_WU", v4i32>;
21882188
defm : VAvgrPat<srl, "VAVGR_DU", v2i64>;
2189+
defm : PatVrVr<avgfloors, "VAVG">;
2190+
defm : PatVrVr<avgceils, "VAVGR">;
2191+
defm : PatVrVrU<avgflooru, "VAVG">;
2192+
defm : PatVrVrU<avgceilu, "VAVGR">;
21892193

21902194
// abs
21912195
def : Pat<(abs v16i8:$vj), (VSIGNCOV_B v16i8:$vj, v16i8:$vj)>;

llvm/test/CodeGen/LoongArch/lasx/ir-instruction/avgfloor-ceil.ll

Lines changed: 16 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ define void @xvavg_b(ptr %res, ptr %a, ptr %b) nounwind {
77
; CHECK: # %bb.0: # %entry
88
; CHECK-NEXT: xvld $xr0, $a1, 0
99
; CHECK-NEXT: xvld $xr1, $a2, 0
10-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
11-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
12-
; CHECK-NEXT: xvsrai.b $xr0, $xr0, 1
13-
; CHECK-NEXT: xvadd.b $xr0, $xr2, $xr0
10+
; CHECK-NEXT: xvavg.b $xr0, $xr0, $xr1
1411
; CHECK-NEXT: xvst $xr0, $a0, 0
1512
; CHECK-NEXT: ret
1613
entry:
@@ -30,10 +27,7 @@ define void @xvavg_h(ptr %res, ptr %a, ptr %b) nounwind {
3027
; CHECK: # %bb.0: # %entry
3128
; CHECK-NEXT: xvld $xr0, $a1, 0
3229
; CHECK-NEXT: xvld $xr1, $a2, 0
33-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
34-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
35-
; CHECK-NEXT: xvsrai.h $xr0, $xr0, 1
36-
; CHECK-NEXT: xvadd.h $xr0, $xr2, $xr0
30+
; CHECK-NEXT: xvavg.h $xr0, $xr0, $xr1
3731
; CHECK-NEXT: xvst $xr0, $a0, 0
3832
; CHECK-NEXT: ret
3933
entry:
@@ -53,10 +47,7 @@ define void @xvavg_w(ptr %res, ptr %a, ptr %b) nounwind {
5347
; CHECK: # %bb.0: # %entry
5448
; CHECK-NEXT: xvld $xr0, $a1, 0
5549
; CHECK-NEXT: xvld $xr1, $a2, 0
56-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
57-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
58-
; CHECK-NEXT: xvsrai.w $xr0, $xr0, 1
59-
; CHECK-NEXT: xvadd.w $xr0, $xr2, $xr0
50+
; CHECK-NEXT: xvavg.w $xr0, $xr0, $xr1
6051
; CHECK-NEXT: xvst $xr0, $a0, 0
6152
; CHECK-NEXT: ret
6253
entry:
@@ -76,10 +67,7 @@ define void @xvavg_d(ptr %res, ptr %a, ptr %b) nounwind {
7667
; CHECK: # %bb.0: # %entry
7768
; CHECK-NEXT: xvld $xr0, $a1, 0
7869
; CHECK-NEXT: xvld $xr1, $a2, 0
79-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
80-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
81-
; CHECK-NEXT: xvsrai.d $xr0, $xr0, 1
82-
; CHECK-NEXT: xvadd.d $xr0, $xr2, $xr0
70+
; CHECK-NEXT: xvavg.d $xr0, $xr0, $xr1
8371
; CHECK-NEXT: xvst $xr0, $a0, 0
8472
; CHECK-NEXT: ret
8573
entry:
@@ -99,10 +87,7 @@ define void @xvavg_bu(ptr %res, ptr %a, ptr %b) nounwind {
9987
; CHECK: # %bb.0: # %entry
10088
; CHECK-NEXT: xvld $xr0, $a1, 0
10189
; CHECK-NEXT: xvld $xr1, $a2, 0
102-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
103-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
104-
; CHECK-NEXT: xvsrli.b $xr0, $xr0, 1
105-
; CHECK-NEXT: xvadd.b $xr0, $xr2, $xr0
90+
; CHECK-NEXT: xvavg.bu $xr0, $xr0, $xr1
10691
; CHECK-NEXT: xvst $xr0, $a0, 0
10792
; CHECK-NEXT: ret
10893
entry:
@@ -122,10 +107,7 @@ define void @xvavg_hu(ptr %res, ptr %a, ptr %b) nounwind {
122107
; CHECK: # %bb.0: # %entry
123108
; CHECK-NEXT: xvld $xr0, $a1, 0
124109
; CHECK-NEXT: xvld $xr1, $a2, 0
125-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
126-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
127-
; CHECK-NEXT: xvsrli.h $xr0, $xr0, 1
128-
; CHECK-NEXT: xvadd.h $xr0, $xr2, $xr0
110+
; CHECK-NEXT: xvavg.hu $xr0, $xr0, $xr1
129111
; CHECK-NEXT: xvst $xr0, $a0, 0
130112
; CHECK-NEXT: ret
131113
entry:
@@ -145,10 +127,7 @@ define void @xvavg_wu(ptr %res, ptr %a, ptr %b) nounwind {
145127
; CHECK: # %bb.0: # %entry
146128
; CHECK-NEXT: xvld $xr0, $a1, 0
147129
; CHECK-NEXT: xvld $xr1, $a2, 0
148-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
149-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
150-
; CHECK-NEXT: xvsrli.w $xr0, $xr0, 1
151-
; CHECK-NEXT: xvadd.w $xr0, $xr2, $xr0
130+
; CHECK-NEXT: xvavg.wu $xr0, $xr0, $xr1
152131
; CHECK-NEXT: xvst $xr0, $a0, 0
153132
; CHECK-NEXT: ret
154133
entry:
@@ -168,10 +147,7 @@ define void @xvavg_du(ptr %res, ptr %a, ptr %b) nounwind {
168147
; CHECK: # %bb.0: # %entry
169148
; CHECK-NEXT: xvld $xr0, $a1, 0
170149
; CHECK-NEXT: xvld $xr1, $a2, 0
171-
; CHECK-NEXT: xvand.v $xr2, $xr0, $xr1
172-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
173-
; CHECK-NEXT: xvsrli.d $xr0, $xr0, 1
174-
; CHECK-NEXT: xvadd.d $xr0, $xr2, $xr0
150+
; CHECK-NEXT: xvavg.du $xr0, $xr0, $xr1
175151
; CHECK-NEXT: xvst $xr0, $a0, 0
176152
; CHECK-NEXT: ret
177153
entry:
@@ -191,10 +167,7 @@ define void @xvavgr_b(ptr %res, ptr %a, ptr %b) nounwind {
191167
; CHECK: # %bb.0: # %entry
192168
; CHECK-NEXT: xvld $xr0, $a1, 0
193169
; CHECK-NEXT: xvld $xr1, $a2, 0
194-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
195-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
196-
; CHECK-NEXT: xvsrai.b $xr0, $xr0, 1
197-
; CHECK-NEXT: xvsub.b $xr0, $xr2, $xr0
170+
; CHECK-NEXT: xvavgr.b $xr0, $xr0, $xr1
198171
; CHECK-NEXT: xvst $xr0, $a0, 0
199172
; CHECK-NEXT: ret
200173
entry:
@@ -215,10 +188,7 @@ define void @xvavgr_h(ptr %res, ptr %a, ptr %b) nounwind {
215188
; CHECK: # %bb.0: # %entry
216189
; CHECK-NEXT: xvld $xr0, $a1, 0
217190
; CHECK-NEXT: xvld $xr1, $a2, 0
218-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
219-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
220-
; CHECK-NEXT: xvsrai.h $xr0, $xr0, 1
221-
; CHECK-NEXT: xvsub.h $xr0, $xr2, $xr0
191+
; CHECK-NEXT: xvavgr.h $xr0, $xr0, $xr1
222192
; CHECK-NEXT: xvst $xr0, $a0, 0
223193
; CHECK-NEXT: ret
224194
entry:
@@ -239,10 +209,7 @@ define void @xvavgr_w(ptr %res, ptr %a, ptr %b) nounwind {
239209
; CHECK: # %bb.0: # %entry
240210
; CHECK-NEXT: xvld $xr0, $a1, 0
241211
; CHECK-NEXT: xvld $xr1, $a2, 0
242-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
243-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
244-
; CHECK-NEXT: xvsrai.w $xr0, $xr0, 1
245-
; CHECK-NEXT: xvsub.w $xr0, $xr2, $xr0
212+
; CHECK-NEXT: xvavgr.w $xr0, $xr0, $xr1
246213
; CHECK-NEXT: xvst $xr0, $a0, 0
247214
; CHECK-NEXT: ret
248215
entry:
@@ -263,10 +230,7 @@ define void @xvavgr_d(ptr %res, ptr %a, ptr %b) nounwind {
263230
; CHECK: # %bb.0: # %entry
264231
; CHECK-NEXT: xvld $xr0, $a1, 0
265232
; CHECK-NEXT: xvld $xr1, $a2, 0
266-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
267-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
268-
; CHECK-NEXT: xvsrai.d $xr0, $xr0, 1
269-
; CHECK-NEXT: xvsub.d $xr0, $xr2, $xr0
233+
; CHECK-NEXT: xvavgr.d $xr0, $xr0, $xr1
270234
; CHECK-NEXT: xvst $xr0, $a0, 0
271235
; CHECK-NEXT: ret
272236
entry:
@@ -287,10 +251,7 @@ define void @xvavgr_bu(ptr %res, ptr %a, ptr %b) nounwind {
287251
; CHECK: # %bb.0: # %entry
288252
; CHECK-NEXT: xvld $xr0, $a1, 0
289253
; CHECK-NEXT: xvld $xr1, $a2, 0
290-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
291-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
292-
; CHECK-NEXT: xvsrli.b $xr0, $xr0, 1
293-
; CHECK-NEXT: xvsub.b $xr0, $xr2, $xr0
254+
; CHECK-NEXT: xvavgr.bu $xr0, $xr0, $xr1
294255
; CHECK-NEXT: xvst $xr0, $a0, 0
295256
; CHECK-NEXT: ret
296257
entry:
@@ -311,10 +272,7 @@ define void @xvavgr_hu(ptr %res, ptr %a, ptr %b) nounwind {
311272
; CHECK: # %bb.0: # %entry
312273
; CHECK-NEXT: xvld $xr0, $a1, 0
313274
; CHECK-NEXT: xvld $xr1, $a2, 0
314-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
315-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
316-
; CHECK-NEXT: xvsrli.h $xr0, $xr0, 1
317-
; CHECK-NEXT: xvsub.h $xr0, $xr2, $xr0
275+
; CHECK-NEXT: xvavgr.hu $xr0, $xr0, $xr1
318276
; CHECK-NEXT: xvst $xr0, $a0, 0
319277
; CHECK-NEXT: ret
320278
entry:
@@ -335,10 +293,7 @@ define void @xvavgr_wu(ptr %res, ptr %a, ptr %b) nounwind {
335293
; CHECK: # %bb.0: # %entry
336294
; CHECK-NEXT: xvld $xr0, $a1, 0
337295
; CHECK-NEXT: xvld $xr1, $a2, 0
338-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
339-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
340-
; CHECK-NEXT: xvsrli.w $xr0, $xr0, 1
341-
; CHECK-NEXT: xvsub.w $xr0, $xr2, $xr0
296+
; CHECK-NEXT: xvavgr.wu $xr0, $xr0, $xr1
342297
; CHECK-NEXT: xvst $xr0, $a0, 0
343298
; CHECK-NEXT: ret
344299
entry:
@@ -359,10 +314,7 @@ define void @xvavgr_du(ptr %res, ptr %a, ptr %b) nounwind {
359314
; CHECK: # %bb.0: # %entry
360315
; CHECK-NEXT: xvld $xr0, $a1, 0
361316
; CHECK-NEXT: xvld $xr1, $a2, 0
362-
; CHECK-NEXT: xvor.v $xr2, $xr0, $xr1
363-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
364-
; CHECK-NEXT: xvsrli.d $xr0, $xr0, 1
365-
; CHECK-NEXT: xvsub.d $xr0, $xr2, $xr0
317+
; CHECK-NEXT: xvavgr.du $xr0, $xr0, $xr1
366318
; CHECK-NEXT: xvst $xr0, $a0, 0
367319
; CHECK-NEXT: ret
368320
entry:

0 commit comments

Comments
 (0)