@@ -205,3 +205,143 @@ define i24 @bitreverse_i24(i24 %x) {
205205 %rev = call i24 @llvm.bitreverse.i24 (i24 %x )
206206 ret i24 %rev
207207}
208+
209+ define i2 @test_ctpop_i2 (i2 %a ) {
210+ ; RV32-LABEL: test_ctpop_i2:
211+ ; RV32: # %bb.0:
212+ ; RV32-NEXT: addi sp, sp, -16
213+ ; RV32-NEXT: .cfi_def_cfa_offset 16
214+ ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
215+ ; RV32-NEXT: .cfi_offset ra, -4
216+ ; RV32-NEXT: andi a0, a0, 3
217+ ; RV32-NEXT: srli a1, a0, 1
218+ ; RV32-NEXT: sub a0, a0, a1
219+ ; RV32-NEXT: zext.b a1, a0
220+ ; RV32-NEXT: srli a1, a1, 2
221+ ; RV32-NEXT: andi a1, a1, 51
222+ ; RV32-NEXT: andi a0, a0, 51
223+ ; RV32-NEXT: add a0, a1, a0
224+ ; RV32-NEXT: srli a1, a0, 4
225+ ; RV32-NEXT: add a0, a1, a0
226+ ; RV32-NEXT: andi a0, a0, 15
227+ ; RV32-NEXT: li a1, 1
228+ ; RV32-NEXT: call __mulsi3
229+ ; RV32-NEXT: zext.b a0, a0
230+ ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
231+ ; RV32-NEXT: .cfi_restore ra
232+ ; RV32-NEXT: addi sp, sp, 16
233+ ; RV32-NEXT: .cfi_def_cfa_offset 0
234+ ; RV32-NEXT: ret
235+ ;
236+ ; RV64-LABEL: test_ctpop_i2:
237+ ; RV64: # %bb.0:
238+ ; RV64-NEXT: addi sp, sp, -16
239+ ; RV64-NEXT: .cfi_def_cfa_offset 16
240+ ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
241+ ; RV64-NEXT: .cfi_offset ra, -8
242+ ; RV64-NEXT: andi a0, a0, 3
243+ ; RV64-NEXT: srli a1, a0, 1
244+ ; RV64-NEXT: sub a0, a0, a1
245+ ; RV64-NEXT: zext.b a1, a0
246+ ; RV64-NEXT: srli a1, a1, 2
247+ ; RV64-NEXT: andi a1, a1, 51
248+ ; RV64-NEXT: andi a0, a0, 51
249+ ; RV64-NEXT: add a0, a1, a0
250+ ; RV64-NEXT: srli a1, a0, 4
251+ ; RV64-NEXT: add a0, a1, a0
252+ ; RV64-NEXT: andi a0, a0, 15
253+ ; RV64-NEXT: li a1, 1
254+ ; RV64-NEXT: call __muldi3
255+ ; RV64-NEXT: zext.b a0, a0
256+ ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
257+ ; RV64-NEXT: .cfi_restore ra
258+ ; RV64-NEXT: addi sp, sp, 16
259+ ; RV64-NEXT: .cfi_def_cfa_offset 0
260+ ; RV64-NEXT: ret
261+ %1 = call i2 @llvm.ctpop.i2 (i2 %a )
262+ ret i2 %1
263+ }
264+
265+ define i11 @test_ctpop_i11 (i11 %a ) {
266+ ; RV32-LABEL: test_ctpop_i11:
267+ ; RV32: # %bb.0:
268+ ; RV32-NEXT: addi sp, sp, -16
269+ ; RV32-NEXT: .cfi_def_cfa_offset 16
270+ ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
271+ ; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
272+ ; RV32-NEXT: .cfi_offset ra, -4
273+ ; RV32-NEXT: .cfi_offset s0, -8
274+ ; RV32-NEXT: andi a0, a0, 2047
275+ ; RV32-NEXT: lui a1, 5
276+ ; RV32-NEXT: lui a2, 16
277+ ; RV32-NEXT: srli a3, a0, 1
278+ ; RV32-NEXT: addi a1, a1, 1365
279+ ; RV32-NEXT: and a1, a3, a1
280+ ; RV32-NEXT: lui a3, 3
281+ ; RV32-NEXT: addi s0, a2, -1
282+ ; RV32-NEXT: addi a2, a3, 819
283+ ; RV32-NEXT: sub a0, a0, a1
284+ ; RV32-NEXT: and a1, a0, s0
285+ ; RV32-NEXT: and a0, a0, a2
286+ ; RV32-NEXT: srli a1, a1, 2
287+ ; RV32-NEXT: and a1, a1, a2
288+ ; RV32-NEXT: lui a2, 1
289+ ; RV32-NEXT: add a0, a1, a0
290+ ; RV32-NEXT: srli a1, a0, 4
291+ ; RV32-NEXT: add a0, a1, a0
292+ ; RV32-NEXT: addi a1, a2, -241
293+ ; RV32-NEXT: and a0, a0, a1
294+ ; RV32-NEXT: li a1, 257
295+ ; RV32-NEXT: call __mulsi3
296+ ; RV32-NEXT: and a0, a0, s0
297+ ; RV32-NEXT: srli a0, a0, 8
298+ ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
299+ ; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
300+ ; RV32-NEXT: .cfi_restore ra
301+ ; RV32-NEXT: .cfi_restore s0
302+ ; RV32-NEXT: addi sp, sp, 16
303+ ; RV32-NEXT: .cfi_def_cfa_offset 0
304+ ; RV32-NEXT: ret
305+ ;
306+ ; RV64-LABEL: test_ctpop_i11:
307+ ; RV64: # %bb.0:
308+ ; RV64-NEXT: addi sp, sp, -16
309+ ; RV64-NEXT: .cfi_def_cfa_offset 16
310+ ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
311+ ; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
312+ ; RV64-NEXT: .cfi_offset ra, -8
313+ ; RV64-NEXT: .cfi_offset s0, -16
314+ ; RV64-NEXT: andi a0, a0, 2047
315+ ; RV64-NEXT: lui a1, 5
316+ ; RV64-NEXT: lui a2, 16
317+ ; RV64-NEXT: srli a3, a0, 1
318+ ; RV64-NEXT: addi a1, a1, 1365
319+ ; RV64-NEXT: and a1, a3, a1
320+ ; RV64-NEXT: lui a3, 3
321+ ; RV64-NEXT: addi s0, a2, -1
322+ ; RV64-NEXT: addi a2, a3, 819
323+ ; RV64-NEXT: sub a0, a0, a1
324+ ; RV64-NEXT: and a1, a0, s0
325+ ; RV64-NEXT: and a0, a0, a2
326+ ; RV64-NEXT: srli a1, a1, 2
327+ ; RV64-NEXT: and a1, a1, a2
328+ ; RV64-NEXT: lui a2, 1
329+ ; RV64-NEXT: add a0, a1, a0
330+ ; RV64-NEXT: srli a1, a0, 4
331+ ; RV64-NEXT: add a0, a1, a0
332+ ; RV64-NEXT: addi a1, a2, -241
333+ ; RV64-NEXT: and a0, a0, a1
334+ ; RV64-NEXT: li a1, 257
335+ ; RV64-NEXT: call __muldi3
336+ ; RV64-NEXT: and a0, a0, s0
337+ ; RV64-NEXT: srli a0, a0, 8
338+ ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
339+ ; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
340+ ; RV64-NEXT: .cfi_restore ra
341+ ; RV64-NEXT: .cfi_restore s0
342+ ; RV64-NEXT: addi sp, sp, 16
343+ ; RV64-NEXT: .cfi_def_cfa_offset 0
344+ ; RV64-NEXT: ret
345+ %1 = call i11 @llvm.ctpop.i11 (i11 %a )
346+ ret i11 %1
347+ }
0 commit comments