Skip to content

Commit 3195696

Browse files
ylzsxLukacma
authored andcommitted
[LoongArch] Lowering vector abs to [x]vsigncov (llvm#162595)
1 parent 7337e64 commit 3195696

File tree

4 files changed

+24
-40
lines changed

4 files changed

+24
-40
lines changed

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2025,10 +2025,10 @@ def : Pat<(v4i32(fp_to_uint v4f64:$vj)),
20252025
sub_128)>;
20262026

20272027
// abs
2028-
def : Pat<(abs v32i8:$xj), (XVMAX_B v32i8:$xj, (XVNEG_B v32i8:$xj))>;
2029-
def : Pat<(abs v16i16:$xj), (XVMAX_H v16i16:$xj, (XVNEG_H v16i16:$xj))>;
2030-
def : Pat<(abs v8i32:$xj), (XVMAX_W v8i32:$xj, (XVNEG_W v8i32:$xj))>;
2031-
def : Pat<(abs v4i64:$xj), (XVMAX_D v4i64:$xj, (XVNEG_D v4i64:$xj))>;
2028+
def : Pat<(abs v32i8:$xj), (XVSIGNCOV_B v32i8:$xj, v32i8:$xj)>;
2029+
def : Pat<(abs v16i16:$xj), (XVSIGNCOV_H v16i16:$xj, v16i16:$xj)>;
2030+
def : Pat<(abs v8i32:$xj), (XVSIGNCOV_W v8i32:$xj, v8i32:$xj)>;
2031+
def : Pat<(abs v4i64:$xj), (XVSIGNCOV_D v4i64:$xj, v4i64:$xj)>;
20322032

20332033
// XVABSD_{B/H/W/D}[U]
20342034
defm : PatXrXr<abds, "XVABSD">;

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2155,10 +2155,10 @@ def : Pat<(f64 f64imm_vldi:$in),
21552155
(f64 (EXTRACT_SUBREG (VLDI (to_f64imm_vldi f64imm_vldi:$in)), sub_64))>;
21562156

21572157
// abs
2158-
def : Pat<(abs v16i8:$vj), (VMAX_B v16i8:$vj, (VNEG_B v16i8:$vj))>;
2159-
def : Pat<(abs v8i16:$vj), (VMAX_H v8i16:$vj, (VNEG_H v8i16:$vj))>;
2160-
def : Pat<(abs v4i32:$vj), (VMAX_W v4i32:$vj, (VNEG_W v4i32:$vj))>;
2161-
def : Pat<(abs v2i64:$vj), (VMAX_D v2i64:$vj, (VNEG_D v2i64:$vj))>;
2158+
def : Pat<(abs v16i8:$vj), (VSIGNCOV_B v16i8:$vj, v16i8:$vj)>;
2159+
def : Pat<(abs v8i16:$vj), (VSIGNCOV_H v8i16:$vj, v8i16:$vj)>;
2160+
def : Pat<(abs v4i32:$vj), (VSIGNCOV_W v4i32:$vj, v4i32:$vj)>;
2161+
def : Pat<(abs v2i64:$vj), (VSIGNCOV_D v2i64:$vj, v2i64:$vj)>;
21622162

21632163
// VABSD_{B/H/W/D}[U]
21642164
defm : PatVrVr<abds, "VABSD">;

llvm/test/CodeGen/LoongArch/lasx/abs.ll

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ define void @vabs_b(ptr %dst, ptr %src) {
66
; CHECK-LABEL: vabs_b:
77
; CHECK: # %bb.0: # %entry
88
; CHECK-NEXT: xvld $xr0, $a1, 0
9-
; CHECK-NEXT: xvneg.b $xr1, $xr0
10-
; CHECK-NEXT: xvmax.b $xr0, $xr0, $xr1
9+
; CHECK-NEXT: xvsigncov.b $xr0, $xr0, $xr0
1110
; CHECK-NEXT: xvst $xr0, $a0, 0
1211
; CHECK-NEXT: ret
1312
entry:
@@ -21,8 +20,7 @@ define void @vabs_b_1(ptr %dst, ptr %src) {
2120
; CHECK-LABEL: vabs_b_1:
2221
; CHECK: # %bb.0: # %entry
2322
; CHECK-NEXT: xvld $xr0, $a1, 0
24-
; CHECK-NEXT: xvneg.b $xr1, $xr0
25-
; CHECK-NEXT: xvmax.b $xr0, $xr0, $xr1
23+
; CHECK-NEXT: xvsigncov.b $xr0, $xr0, $xr0
2624
; CHECK-NEXT: xvst $xr0, $a0, 0
2725
; CHECK-NEXT: ret
2826
entry:
@@ -36,8 +34,7 @@ define void @vabs_h(ptr %dst, ptr %src) {
3634
; CHECK-LABEL: vabs_h:
3735
; CHECK: # %bb.0: # %entry
3836
; CHECK-NEXT: xvld $xr0, $a1, 0
39-
; CHECK-NEXT: xvneg.h $xr1, $xr0
40-
; CHECK-NEXT: xvmax.h $xr0, $xr0, $xr1
37+
; CHECK-NEXT: xvsigncov.h $xr0, $xr0, $xr0
4138
; CHECK-NEXT: xvst $xr0, $a0, 0
4239
; CHECK-NEXT: ret
4340
entry:
@@ -51,8 +48,7 @@ define void @vabs_h_1(ptr %dst, ptr %src) {
5148
; CHECK-LABEL: vabs_h_1:
5249
; CHECK: # %bb.0: # %entry
5350
; CHECK-NEXT: xvld $xr0, $a1, 0
54-
; CHECK-NEXT: xvneg.h $xr1, $xr0
55-
; CHECK-NEXT: xvmax.h $xr0, $xr0, $xr1
51+
; CHECK-NEXT: xvsigncov.h $xr0, $xr0, $xr0
5652
; CHECK-NEXT: xvst $xr0, $a0, 0
5753
; CHECK-NEXT: ret
5854
entry:
@@ -66,8 +62,7 @@ define void @vabs_w(ptr %dst, ptr %src) {
6662
; CHECK-LABEL: vabs_w:
6763
; CHECK: # %bb.0: # %entry
6864
; CHECK-NEXT: xvld $xr0, $a1, 0
69-
; CHECK-NEXT: xvneg.w $xr1, $xr0
70-
; CHECK-NEXT: xvmax.w $xr0, $xr0, $xr1
65+
; CHECK-NEXT: xvsigncov.w $xr0, $xr0, $xr0
7166
; CHECK-NEXT: xvst $xr0, $a0, 0
7267
; CHECK-NEXT: ret
7368
entry:
@@ -81,8 +76,7 @@ define void @vabs_w_1(ptr %dst, ptr %src) {
8176
; CHECK-LABEL: vabs_w_1:
8277
; CHECK: # %bb.0: # %entry
8378
; CHECK-NEXT: xvld $xr0, $a1, 0
84-
; CHECK-NEXT: xvneg.w $xr1, $xr0
85-
; CHECK-NEXT: xvmax.w $xr0, $xr0, $xr1
79+
; CHECK-NEXT: xvsigncov.w $xr0, $xr0, $xr0
8680
; CHECK-NEXT: xvst $xr0, $a0, 0
8781
; CHECK-NEXT: ret
8882
entry:
@@ -96,8 +90,7 @@ define void @vabs_d(ptr %dst, ptr %src) {
9690
; CHECK-LABEL: vabs_d:
9791
; CHECK: # %bb.0: # %entry
9892
; CHECK-NEXT: xvld $xr0, $a1, 0
99-
; CHECK-NEXT: xvneg.d $xr1, $xr0
100-
; CHECK-NEXT: xvmax.d $xr0, $xr0, $xr1
93+
; CHECK-NEXT: xvsigncov.d $xr0, $xr0, $xr0
10194
; CHECK-NEXT: xvst $xr0, $a0, 0
10295
; CHECK-NEXT: ret
10396
entry:
@@ -111,8 +104,7 @@ define void @vabs_d_1(ptr %dst, ptr %src) {
111104
; CHECK-LABEL: vabs_d_1:
112105
; CHECK: # %bb.0: # %entry
113106
; CHECK-NEXT: xvld $xr0, $a1, 0
114-
; CHECK-NEXT: xvneg.d $xr1, $xr0
115-
; CHECK-NEXT: xvmax.d $xr0, $xr0, $xr1
107+
; CHECK-NEXT: xvsigncov.d $xr0, $xr0, $xr0
116108
; CHECK-NEXT: xvst $xr0, $a0, 0
117109
; CHECK-NEXT: ret
118110
entry:

llvm/test/CodeGen/LoongArch/lsx/abs.ll

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ define void @vabs_b(ptr %dst, ptr %src) {
66
; CHECK-LABEL: vabs_b:
77
; CHECK: # %bb.0: # %entry
88
; CHECK-NEXT: vld $vr0, $a1, 0
9-
; CHECK-NEXT: vneg.b $vr1, $vr0
10-
; CHECK-NEXT: vmax.b $vr0, $vr0, $vr1
9+
; CHECK-NEXT: vsigncov.b $vr0, $vr0, $vr0
1110
; CHECK-NEXT: vst $vr0, $a0, 0
1211
; CHECK-NEXT: ret
1312
entry:
@@ -21,8 +20,7 @@ define void @vabs_b_1(ptr %dst, ptr %src) {
2120
; CHECK-LABEL: vabs_b_1:
2221
; CHECK: # %bb.0: # %entry
2322
; CHECK-NEXT: vld $vr0, $a1, 0
24-
; CHECK-NEXT: vneg.b $vr1, $vr0
25-
; CHECK-NEXT: vmax.b $vr0, $vr0, $vr1
23+
; CHECK-NEXT: vsigncov.b $vr0, $vr0, $vr0
2624
; CHECK-NEXT: vst $vr0, $a0, 0
2725
; CHECK-NEXT: ret
2826
entry:
@@ -36,8 +34,7 @@ define void @vabs_h(ptr %dst, ptr %src) {
3634
; CHECK-LABEL: vabs_h:
3735
; CHECK: # %bb.0: # %entry
3836
; CHECK-NEXT: vld $vr0, $a1, 0
39-
; CHECK-NEXT: vneg.h $vr1, $vr0
40-
; CHECK-NEXT: vmax.h $vr0, $vr0, $vr1
37+
; CHECK-NEXT: vsigncov.h $vr0, $vr0, $vr0
4138
; CHECK-NEXT: vst $vr0, $a0, 0
4239
; CHECK-NEXT: ret
4340
entry:
@@ -51,8 +48,7 @@ define void @vabs_h_1(ptr %dst, ptr %src) {
5148
; CHECK-LABEL: vabs_h_1:
5249
; CHECK: # %bb.0: # %entry
5350
; CHECK-NEXT: vld $vr0, $a1, 0
54-
; CHECK-NEXT: vneg.h $vr1, $vr0
55-
; CHECK-NEXT: vmax.h $vr0, $vr0, $vr1
51+
; CHECK-NEXT: vsigncov.h $vr0, $vr0, $vr0
5652
; CHECK-NEXT: vst $vr0, $a0, 0
5753
; CHECK-NEXT: ret
5854
entry:
@@ -66,8 +62,7 @@ define void @vabs_w(ptr %dst, ptr %src) {
6662
; CHECK-LABEL: vabs_w:
6763
; CHECK: # %bb.0: # %entry
6864
; CHECK-NEXT: vld $vr0, $a1, 0
69-
; CHECK-NEXT: vneg.w $vr1, $vr0
70-
; CHECK-NEXT: vmax.w $vr0, $vr0, $vr1
65+
; CHECK-NEXT: vsigncov.w $vr0, $vr0, $vr0
7166
; CHECK-NEXT: vst $vr0, $a0, 0
7267
; CHECK-NEXT: ret
7368
entry:
@@ -81,8 +76,7 @@ define void @vabs_w_1(ptr %dst, ptr %src) {
8176
; CHECK-LABEL: vabs_w_1:
8277
; CHECK: # %bb.0: # %entry
8378
; CHECK-NEXT: vld $vr0, $a1, 0
84-
; CHECK-NEXT: vneg.w $vr1, $vr0
85-
; CHECK-NEXT: vmax.w $vr0, $vr0, $vr1
79+
; CHECK-NEXT: vsigncov.w $vr0, $vr0, $vr0
8680
; CHECK-NEXT: vst $vr0, $a0, 0
8781
; CHECK-NEXT: ret
8882
entry:
@@ -96,8 +90,7 @@ define void @vabs_d(ptr %dst, ptr %src) {
9690
; CHECK-LABEL: vabs_d:
9791
; CHECK: # %bb.0: # %entry
9892
; CHECK-NEXT: vld $vr0, $a1, 0
99-
; CHECK-NEXT: vneg.d $vr1, $vr0
100-
; CHECK-NEXT: vmax.d $vr0, $vr0, $vr1
93+
; CHECK-NEXT: vsigncov.d $vr0, $vr0, $vr0
10194
; CHECK-NEXT: vst $vr0, $a0, 0
10295
; CHECK-NEXT: ret
10396
entry:
@@ -111,8 +104,7 @@ define void @vabs_d_1(ptr %dst, ptr %src) {
111104
; CHECK-LABEL: vabs_d_1:
112105
; CHECK: # %bb.0: # %entry
113106
; CHECK-NEXT: vld $vr0, $a1, 0
114-
; CHECK-NEXT: vneg.d $vr1, $vr0
115-
; CHECK-NEXT: vmax.d $vr0, $vr0, $vr1
107+
; CHECK-NEXT: vsigncov.d $vr0, $vr0, $vr0
116108
; CHECK-NEXT: vst $vr0, $a0, 0
117109
; CHECK-NEXT: ret
118110
entry:

0 commit comments

Comments
 (0)