Skip to content

Commit dd349da

Browse files
committed
[LoongArch] Add patterns for [x]vclo.{b/h/w/d} instructions
1 parent d2625a4 commit dd349da

File tree

4 files changed

+20
-22
lines changed

4 files changed

+20
-22
lines changed

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,6 +1443,12 @@ defm : PatXrXr<sra, "XVSRA">;
14431443
defm : PatShiftXrXr<sra, "XVSRA">;
14441444
defm : PatShiftXrSplatUimm<sra, "XVSRAI">;
14451445

1446+
// XVCLO_{B/H/W/D}
1447+
def : Pat<(ctlz (vnot v32i8:$xj)), (XVCLO_B v32i8:$xj)>;
1448+
def : Pat<(ctlz (vnot v16i16:$xj)), (XVCLO_H v16i16:$xj)>;
1449+
def : Pat<(ctlz (vnot v8i32:$xj)), (XVCLO_W v8i32:$xj)>;
1450+
def : Pat<(ctlz (vnot v4i64:$xj)), (XVCLO_D v4i64:$xj)>;
1451+
14461452
// XVCLZ_{B/H/W/D}
14471453
defm : PatXr<ctlz, "XVCLZ">;
14481454

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,6 +1645,12 @@ defm : PatVrVr<sra, "VSRA">;
16451645
defm : PatShiftVrVr<sra, "VSRA">;
16461646
defm : PatShiftVrSplatUimm<sra, "VSRAI">;
16471647

1648+
// VCLO_{B/H/W/D}
1649+
def : Pat<(ctlz (vnot v16i8:$vj)), (VCLO_B v16i8:$vj)>;
1650+
def : Pat<(ctlz (vnot v8i16:$vj)), (VCLO_H v8i16:$vj)>;
1651+
def : Pat<(ctlz (vnot v4i32:$vj)), (VCLO_W v4i32:$vj)>;
1652+
def : Pat<(ctlz (vnot v2i64:$vj)), (VCLO_D v2i64:$vj)>;
1653+
16481654
// VCLZ_{B/H/W/D}
16491655
defm : PatVr<ctlz, "VCLZ">;
16501656

llvm/test/CodeGen/LoongArch/lasx/ctpop-ctlz.ll

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ define void @not_ctlz_v32i8(ptr %src, ptr %dst) nounwind {
110110
; CHECK-LABEL: not_ctlz_v32i8:
111111
; CHECK: # %bb.0:
112112
; CHECK-NEXT: xvld $xr0, $a0, 0
113-
; CHECK-NEXT: xvxori.b $xr0, $xr0, 255
114-
; CHECK-NEXT: xvclz.b $xr0, $xr0
113+
; CHECK-NEXT: xvclo.b $xr0, $xr0
115114
; CHECK-NEXT: xvst $xr0, $a1, 0
116115
; CHECK-NEXT: ret
117116
%v = load <32 x i8>, ptr %src
@@ -125,9 +124,7 @@ define void @not_ctlz_v16i16(ptr %src, ptr %dst) nounwind {
125124
; CHECK-LABEL: not_ctlz_v16i16:
126125
; CHECK: # %bb.0:
127126
; CHECK-NEXT: xvld $xr0, $a0, 0
128-
; CHECK-NEXT: xvrepli.b $xr1, -1
129-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
130-
; CHECK-NEXT: xvclz.h $xr0, $xr0
127+
; CHECK-NEXT: xvclo.h $xr0, $xr0
131128
; CHECK-NEXT: xvst $xr0, $a1, 0
132129
; CHECK-NEXT: ret
133130
%v = load <16 x i16>, ptr %src
@@ -141,9 +138,7 @@ define void @not_ctlz_v8i32(ptr %src, ptr %dst) nounwind {
141138
; CHECK-LABEL: not_ctlz_v8i32:
142139
; CHECK: # %bb.0:
143140
; CHECK-NEXT: xvld $xr0, $a0, 0
144-
; CHECK-NEXT: xvrepli.b $xr1, -1
145-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
146-
; CHECK-NEXT: xvclz.w $xr0, $xr0
141+
; CHECK-NEXT: xvclo.w $xr0, $xr0
147142
; CHECK-NEXT: xvst $xr0, $a1, 0
148143
; CHECK-NEXT: ret
149144
%v = load <8 x i32>, ptr %src
@@ -157,9 +152,7 @@ define void @not_ctlz_v4i64(ptr %src, ptr %dst) nounwind {
157152
; CHECK-LABEL: not_ctlz_v4i64:
158153
; CHECK: # %bb.0:
159154
; CHECK-NEXT: xvld $xr0, $a0, 0
160-
; CHECK-NEXT: xvrepli.b $xr1, -1
161-
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
162-
; CHECK-NEXT: xvclz.d $xr0, $xr0
155+
; CHECK-NEXT: xvclo.d $xr0, $xr0
163156
; CHECK-NEXT: xvst $xr0, $a1, 0
164157
; CHECK-NEXT: ret
165158
%v = load <4 x i64>, ptr %src

llvm/test/CodeGen/LoongArch/lsx/ctpop-ctlz.ll

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ define void @not_ctlz_v16i8(ptr %src, ptr %dst) nounwind {
110110
; CHECK-LABEL: not_ctlz_v16i8:
111111
; CHECK: # %bb.0:
112112
; CHECK-NEXT: vld $vr0, $a0, 0
113-
; CHECK-NEXT: vxori.b $vr0, $vr0, 255
114-
; CHECK-NEXT: vclz.b $vr0, $vr0
113+
; CHECK-NEXT: vclo.b $vr0, $vr0
115114
; CHECK-NEXT: vst $vr0, $a1, 0
116115
; CHECK-NEXT: ret
117116
%v = load <16 x i8>, ptr %src
@@ -125,9 +124,7 @@ define void @not_ctlz_v8i16(ptr %src, ptr %dst) nounwind {
125124
; CHECK-LABEL: not_ctlz_v8i16:
126125
; CHECK: # %bb.0:
127126
; CHECK-NEXT: vld $vr0, $a0, 0
128-
; CHECK-NEXT: vrepli.b $vr1, -1
129-
; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1
130-
; CHECK-NEXT: vclz.h $vr0, $vr0
127+
; CHECK-NEXT: vclo.h $vr0, $vr0
131128
; CHECK-NEXT: vst $vr0, $a1, 0
132129
; CHECK-NEXT: ret
133130
%v = load <8 x i16>, ptr %src
@@ -141,9 +138,7 @@ define void @not_ctlz_v4i32(ptr %src, ptr %dst) nounwind {
141138
; CHECK-LABEL: not_ctlz_v4i32:
142139
; CHECK: # %bb.0:
143140
; CHECK-NEXT: vld $vr0, $a0, 0
144-
; CHECK-NEXT: vrepli.b $vr1, -1
145-
; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1
146-
; CHECK-NEXT: vclz.w $vr0, $vr0
141+
; CHECK-NEXT: vclo.w $vr0, $vr0
147142
; CHECK-NEXT: vst $vr0, $a1, 0
148143
; CHECK-NEXT: ret
149144
%v = load <4 x i32>, ptr %src
@@ -157,9 +152,7 @@ define void @not_ctlz_v2i64(ptr %src, ptr %dst) nounwind {
157152
; CHECK-LABEL: not_ctlz_v2i64:
158153
; CHECK: # %bb.0:
159154
; CHECK-NEXT: vld $vr0, $a0, 0
160-
; CHECK-NEXT: vrepli.b $vr1, -1
161-
; CHECK-NEXT: vxor.v $vr0, $vr0, $vr1
162-
; CHECK-NEXT: vclz.d $vr0, $vr0
155+
; CHECK-NEXT: vclo.d $vr0, $vr0
163156
; CHECK-NEXT: vst $vr0, $a1, 0
164157
; CHECK-NEXT: ret
165158
%v = load <2 x i64>, ptr %src

0 commit comments

Comments
 (0)