Skip to content

Commit d2625a4

Browse files
authored
[LoongArch][NFC] Pre-commit tests for vclo which counts the leading ones for each vector elements (llvm#165980)
1 parent 82cf54f commit d2625a4

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,69 @@ define void @ctlz_v4i64(ptr %src, ptr %dst) nounwind {
106106
ret void
107107
}
108108

109+
define void @not_ctlz_v32i8(ptr %src, ptr %dst) nounwind {
110+
; CHECK-LABEL: not_ctlz_v32i8:
111+
; CHECK: # %bb.0:
112+
; CHECK-NEXT: xvld $xr0, $a0, 0
113+
; CHECK-NEXT: xvxori.b $xr0, $xr0, 255
114+
; CHECK-NEXT: xvclz.b $xr0, $xr0
115+
; CHECK-NEXT: xvst $xr0, $a1, 0
116+
; CHECK-NEXT: ret
117+
%v = load <32 x i8>, ptr %src
118+
%neg = xor <32 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
119+
%res = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %neg, i1 false)
120+
store <32 x i8> %res, ptr %dst
121+
ret void
122+
}
123+
124+
define void @not_ctlz_v16i16(ptr %src, ptr %dst) nounwind {
125+
; CHECK-LABEL: not_ctlz_v16i16:
126+
; CHECK: # %bb.0:
127+
; 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
131+
; CHECK-NEXT: xvst $xr0, $a1, 0
132+
; CHECK-NEXT: ret
133+
%v = load <16 x i16>, ptr %src
134+
%neg = xor <16 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
135+
%res = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %neg, i1 false)
136+
store <16 x i16> %res, ptr %dst
137+
ret void
138+
}
139+
140+
define void @not_ctlz_v8i32(ptr %src, ptr %dst) nounwind {
141+
; CHECK-LABEL: not_ctlz_v8i32:
142+
; CHECK: # %bb.0:
143+
; 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
147+
; CHECK-NEXT: xvst $xr0, $a1, 0
148+
; CHECK-NEXT: ret
149+
%v = load <8 x i32>, ptr %src
150+
%neg = xor <8 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
151+
%res = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %neg, i1 false)
152+
store <8 x i32> %res, ptr %dst
153+
ret void
154+
}
155+
156+
define void @not_ctlz_v4i64(ptr %src, ptr %dst) nounwind {
157+
; CHECK-LABEL: not_ctlz_v4i64:
158+
; CHECK: # %bb.0:
159+
; 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
163+
; CHECK-NEXT: xvst $xr0, $a1, 0
164+
; CHECK-NEXT: ret
165+
%v = load <4 x i64>, ptr %src
166+
%neg = xor <4 x i64> %v, <i64 -1, i64 -1, i64 -1, i64 -1>
167+
%res = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %neg, i1 false)
168+
store <4 x i64> %res, ptr %dst
169+
ret void
170+
}
171+
109172
declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)
110173
declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)
111174
declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,69 @@ define void @ctlz_v2i64(ptr %src, ptr %dst) nounwind {
106106
ret void
107107
}
108108

109+
define void @not_ctlz_v16i8(ptr %src, ptr %dst) nounwind {
110+
; CHECK-LABEL: not_ctlz_v16i8:
111+
; CHECK: # %bb.0:
112+
; CHECK-NEXT: vld $vr0, $a0, 0
113+
; CHECK-NEXT: vxori.b $vr0, $vr0, 255
114+
; CHECK-NEXT: vclz.b $vr0, $vr0
115+
; CHECK-NEXT: vst $vr0, $a1, 0
116+
; CHECK-NEXT: ret
117+
%v = load <16 x i8>, ptr %src
118+
%neg = xor <16 x i8> %v, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
119+
%res = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %neg, i1 false)
120+
store <16 x i8> %res, ptr %dst
121+
ret void
122+
}
123+
124+
define void @not_ctlz_v8i16(ptr %src, ptr %dst) nounwind {
125+
; CHECK-LABEL: not_ctlz_v8i16:
126+
; CHECK: # %bb.0:
127+
; 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
131+
; CHECK-NEXT: vst $vr0, $a1, 0
132+
; CHECK-NEXT: ret
133+
%v = load <8 x i16>, ptr %src
134+
%neg = xor <8 x i16> %v, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
135+
%res = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %neg, i1 false)
136+
store <8 x i16> %res, ptr %dst
137+
ret void
138+
}
139+
140+
define void @not_ctlz_v4i32(ptr %src, ptr %dst) nounwind {
141+
; CHECK-LABEL: not_ctlz_v4i32:
142+
; CHECK: # %bb.0:
143+
; 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
147+
; CHECK-NEXT: vst $vr0, $a1, 0
148+
; CHECK-NEXT: ret
149+
%v = load <4 x i32>, ptr %src
150+
%neg = xor <4 x i32> %v, <i32 -1, i32 -1, i32 -1, i32 -1>
151+
%res = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %neg, i1 false)
152+
store <4 x i32> %res, ptr %dst
153+
ret void
154+
}
155+
156+
define void @not_ctlz_v2i64(ptr %src, ptr %dst) nounwind {
157+
; CHECK-LABEL: not_ctlz_v2i64:
158+
; CHECK: # %bb.0:
159+
; 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
163+
; CHECK-NEXT: vst $vr0, $a1, 0
164+
; CHECK-NEXT: ret
165+
%v = load <2 x i64>, ptr %src
166+
%neg = xor <2 x i64> %v, <i64 -1, i64 -1>
167+
%res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %neg, i1 false)
168+
store <2 x i64> %res, ptr %dst
169+
ret void
170+
}
171+
109172
declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
110173
declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
111174
declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)

0 commit comments

Comments
 (0)