@@ -109,6 +109,20 @@ entry:
109109 ret i128 %b
110110}
111111
112+ define i32 @test_trunc_v128i1 (<128 x i1 > %x ) {
113+ ; CHECK-LABEL: test_trunc_v128i1:
114+ ; CHECK: # %bb.0: # %entry
115+ ; CHECK-NEXT: li a0, 128
116+ ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
117+ ; CHECK-NEXT: vcpop.m a0, v0
118+ ; CHECK-NEXT: ret
119+ entry:
120+ %a = bitcast <128 x i1 > %x to i128
121+ %b = call i128 @llvm.ctpop.i128 (i128 %a )
122+ %c = trunc i128 %b to i32
123+ ret i32 %c
124+ }
125+
112126define i256 @test_v256i1 (<256 x i1 > %x ) {
113127; RV32-LABEL: test_v256i1:
114128; RV32: # %bb.0: # %entry
@@ -148,10 +162,10 @@ define i256 @test_v256i1(<256 x i1> %x) {
148162; RV32-NEXT: sltu a2, a1, a6
149163; RV32-NEXT: add a3, a4, a3
150164; RV32-NEXT: add a3, a3, a2
151- ; RV32-NEXT: beq a3, a4, .LBB7_2
165+ ; RV32-NEXT: beq a3, a4, .LBB8_2
152166; RV32-NEXT: # %bb.1: # %entry
153167; RV32-NEXT: sltu a2, a3, a4
154- ; RV32-NEXT: .LBB7_2 : # %entry
168+ ; RV32-NEXT: .LBB8_2 : # %entry
155169; RV32-NEXT: sw zero, 16(a0)
156170; RV32-NEXT: sw zero, 20(a0)
157171; RV32-NEXT: sw zero, 24(a0)
@@ -189,3 +203,63 @@ entry:
189203 %b = call i256 @llvm.ctpop.i256 (i256 %a )
190204 ret i256 %b
191205}
206+
207+ define i32 @test_trunc_v256i1 (<256 x i1 > %x ) {
208+ ; RV32-LABEL: test_trunc_v256i1:
209+ ; RV32: # %bb.0: # %entry
210+ ; RV32-NEXT: vsetivli zero, 1, e64, m1, ta, ma
211+ ; RV32-NEXT: vslidedown.vi v9, v0, 1
212+ ; RV32-NEXT: li a0, 32
213+ ; RV32-NEXT: vslidedown.vi v10, v8, 1
214+ ; RV32-NEXT: vmv.x.s a1, v0
215+ ; RV32-NEXT: vmv.x.s a2, v8
216+ ; RV32-NEXT: vsrl.vx v11, v9, a0
217+ ; RV32-NEXT: vsrl.vx v12, v0, a0
218+ ; RV32-NEXT: vmv.x.s a3, v9
219+ ; RV32-NEXT: vsrl.vx v9, v10, a0
220+ ; RV32-NEXT: vsrl.vx v8, v8, a0
221+ ; RV32-NEXT: vmv.x.s a0, v10
222+ ; RV32-NEXT: cpop a2, a2
223+ ; RV32-NEXT: cpop a1, a1
224+ ; RV32-NEXT: vmv.x.s a4, v11
225+ ; RV32-NEXT: vmv.x.s a5, v12
226+ ; RV32-NEXT: vmv.x.s a6, v9
227+ ; RV32-NEXT: vmv.x.s a7, v8
228+ ; RV32-NEXT: cpop a0, a0
229+ ; RV32-NEXT: cpop a3, a3
230+ ; RV32-NEXT: cpop a7, a7
231+ ; RV32-NEXT: cpop a6, a6
232+ ; RV32-NEXT: cpop a5, a5
233+ ; RV32-NEXT: cpop a4, a4
234+ ; RV32-NEXT: add a2, a2, a7
235+ ; RV32-NEXT: add a0, a0, a6
236+ ; RV32-NEXT: add a1, a1, a5
237+ ; RV32-NEXT: add a3, a3, a4
238+ ; RV32-NEXT: add a0, a2, a0
239+ ; RV32-NEXT: add a1, a1, a3
240+ ; RV32-NEXT: add a0, a1, a0
241+ ; RV32-NEXT: ret
242+ ;
243+ ; RV64-LABEL: test_trunc_v256i1:
244+ ; RV64: # %bb.0: # %entry
245+ ; RV64-NEXT: vsetivli zero, 1, e64, m1, ta, ma
246+ ; RV64-NEXT: vslidedown.vi v9, v0, 1
247+ ; RV64-NEXT: vmv.x.s a0, v0
248+ ; RV64-NEXT: vslidedown.vi v10, v8, 1
249+ ; RV64-NEXT: vmv.x.s a1, v8
250+ ; RV64-NEXT: vmv.x.s a2, v9
251+ ; RV64-NEXT: vmv.x.s a3, v10
252+ ; RV64-NEXT: cpop a1, a1
253+ ; RV64-NEXT: cpop a0, a0
254+ ; RV64-NEXT: cpop a3, a3
255+ ; RV64-NEXT: cpop a2, a2
256+ ; RV64-NEXT: add a1, a1, a3
257+ ; RV64-NEXT: add a0, a0, a2
258+ ; RV64-NEXT: add a0, a0, a1
259+ ; RV64-NEXT: ret
260+ entry:
261+ %a = bitcast <256 x i1 > %x to i256
262+ %b = call i256 @llvm.ctpop.i256 (i256 %a )
263+ %c = trunc i256 %b to i32
264+ ret i32 %c
265+ }
0 commit comments